왜 java.util일까요?선택사항은 Serialable이 아닙니다. 이러한 필드를 사용하여 개체를 Serialize하는 방법
Enum 클래스는 Serialable이므로 Enum을 사용하여 개체를 직렬화하는 데 문제가 없습니다.다른 하나는 클래스에 java.util 필드가 있는 경우입니다.옵션 클래스이 경우, 다음의 예외가 발생합니다.java.io시리얼화 불가예외: java.util.선택적.
이런 수업들을 어떻게 다뤄야 하는지, 어떻게 연재합니까?원격 EJB 또는 RMI를 통해 이러한 물체를 전송할 수 있습니까?
다음은 예를 제시하겠습니다.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Optional;
import org.junit.Test;
public class SerializationTest {
static class My implements Serializable {
private static final long serialVersionUID = 1L;
Optional<Integer> value = Optional.empty();
public void setValue(Integer i) {
this.i = Optional.of(i);
}
public Optional<Integer> getValue() {
return value;
}
}
//java.io.NotSerializableException is thrown
@Test
public void serialize() {
My my = new My();
byte[] bytes = toBytes(my);
}
public static <T extends Serializable> byte[] toBytes(T reportInfo) {
try (ByteArrayOutputStream bstream = new ByteArrayOutputStream()) {
try (ObjectOutputStream ostream = new ObjectOutputStream(bstream)) {
ostream.writeObject(reportInfo);
}
return bstream.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
이 답변은 "선택사항은 시리얼화 가능해야 하지 않을까요?"라는 제목의 질문에 대한 답변입니다.간단히 말하면 Java Lambda(JSR-335) 전문가 그룹이 검토했지만 거부한 것입니다.이 메모, 이 메모와 이 메모는 설계상의 주요 목표를 나타내고 있습니다.Optional
반환값이 없을 가능성이 있는 경우 함수의 반환값으로 사용됩니다. 목적은 것입니다.Optional
실제 값이 존재하는 경우 추출합니다.값이 없는 경우 발신자는 기본값을 대체하거나 예외를 발생시키거나 다른 정책을 적용할 수 있습니다. 메서드하여 fluent 메서드콜을 은 fluent 메서드는 fluent 메서드콜이 반환됩니다.Optional
★★★★★★ 。
은 결코 된 것이 아니었다.Optional
옵션 메서드 인수 또는 객체의 필드로 저장 등 다른 방법으로 사용됩니다.그리고 그 연장선상에서,Optional
serializable을 사용하면 네트워크를 통해 데이터를 지속적으로 저장하거나 전송할 수 있으며, 둘 다 원래 설계 목표를 훨씬 초과한 사용을 장려합니다.
으로 데이터를 보다 더 방법이 .Optional
getter 등):getValue
in squestion method를 합니다.Optional
이 필드에서는 모든 발신자가 빈 값을 처리하기 위한 정책을 구현하도록 강제합니다.이것에 의해, 발신자간에 부주의한 동작이 발생할 가능성이 있습니다.대부분의 경우 필드의 코드 집합이 설정될 때 정책을 적용하는 것이 좋습니다.
은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Optional
를 들면, 수집품으로.List<Optional<X>>
★★★★★★★★★★★★★★★★★」Map<Key,Optional<Value>>
을 사용하다은 자주 사용하는 것이 Optional
Null-Object 값 포함(실제 아님)null
참조) 또는 단순히 이러한 엔트리를 컬렉션에서 완전히 제외합니다.
많은.Serialization
관련된 문제는 영속적인 시리얼라이즈드 폼을 실제 실행 시 구현에서 분리함으로써 해결할 수 있습니다.
/** The class you work with in your runtime */
public class My implements Serializable {
private static final long serialVersionUID = 1L;
Optional<Integer> value = Optional.empty();
public void setValue(Integer i) {
this.value = Optional.ofNullable(i);
}
public Optional<Integer> getValue() {
return value;
}
private Object writeReplace() throws ObjectStreamException
{
return new MySerialized(this);
}
}
/** The persistent representation which exists in bytestreams only */
final class MySerialized implements Serializable {
private final Integer value;
MySerialized(My my) {
value=my.getValue().orElse(null);
}
private Object readResolve() throws ObjectStreamException {
My my=new My();
my.setValue(value);
return my;
}
}
학급.Optional
는 존재하지 않을 가능성이 있는 값을 처리할 때 적절한 코드를 쓸 수 있는 동작을 구현합니다(사용에 대한 설명).null
). 단, 데이터의 영속적인 표시에는 이점이 없습니다.시리얼화된 데이터를 더 크게 만들 뿐입니다.
위의 스케치는 복잡해 보일 수 있지만, 그것은 하나의 특성만을 가진 패턴을 보여주기 때문입니다.클래스가 속성을 많이 가질수록 클래스의 단순성이 더 많이 드러날 것입니다.
잊지 할 은, '이행하다'의 수 있는 가능성입니다.My
영속적인 폼을 변경할 필요가 전혀 없습니다.
시리얼 가능한 옵션을 원하는 경우 시리얼 가능한 guava 옵션 사용을 고려하십시오.
신기한 누락이다.
.transient
만의 커스텀을 수 있습니다.writeObject()
쓴 get()
자체 및 "결과"가 있습니다.readObject()
를 Optional
흐름에서 나온 결과를 읽음으로써요. 말고 해 주세요.defaultWriteObject()
★★★★★★★★★★★★★★★★★」defaultReadObject()
각각 다음과 같다.
io 라이브러리 Javaslang)에는 Vavr.io의 Javaslang도 .에는Option
다음 중 하나:
public interface Option<T> extends Value<T>, Serializable { ... }
좀 더 일관된 유형 목록을 유지하고 null을 사용하지 않으려면 기발한 대안이 하나 있습니다.
유형의 교차를 사용하여 값을 저장할 수 있습니다.람다와 함께 사용하면 다음과 같은 이점이 있습니다.
private final Supplier<Optional<Integer>> suppValue;
....
List<Integer> temp = value
.map(v -> v.map(Arrays::asList).orElseGet(ArrayList::new))
.orElse(null);
this.suppValue = (Supplier<Optional<Integer>> & Serializable)() -> temp==null ? Optional.empty() : temp.stream().findFirst();
「 」를 가지고 .temp
separate의 합니다.value
너무 많이 연재하고 있어요.
위한 같이 할 때 .이를 피하기 위한 기본 솔루션, 변수를 옵션 없이 제공하고 아래와 같이 getter에 문의할 때 옵션으로 가져옵니다. Optional<Integer> value = Optional.empty();
로로 합니다.Integer value = null;
public class My implements Serializable {
private static final long serialVersionUID = 1L;
//Optional<Integer> value = Optional.empty(); //old code
Integer value = null; //solution code without optional.
public void setValue(Integer value ) {
//this.value = Optional.of(value); //old code with Optional
this.value = value ; //solution code without optional.
}
public Optional<Integer> getValue() {
//solution code - return the value by using Optional.
return Optional.ofNullable(value);
}
}
Optional 클래스를 프로젝트에 복사하고 Serialable을 구현하는 사용자 정의 Optional을 직접 생성하기만 하면 됩니다.너무 늦지 않았다는 걸 깨달아서 하는 거야
언급URL : https://stackoverflow.com/questions/24547673/why-java-util-optional-is-not-serializable-how-to-serialize-the-object-with-suc
'programing' 카테고리의 다른 글
파손된 xampp 'mysql.user' 테이블 복구 방법 (0) | 2022.11.04 |
---|---|
PHP에서 이메일을 검증하는 방법 (0) | 2022.11.04 |
여러 OR 조건이 있는 ZF2 원칙 쿼리 (0) | 2022.11.04 |
PHP용 예쁜 프린트가 있나요? (0) | 2022.11.04 |
업데이트 참여에 대한 MySQL 구문 (0) | 2022.11.04 |