gpt4 book ai didi

java - java.util.Optional为什么不是Serializable,如何用这样的字段序列化对象

转载 作者:IT老高 更新时间:2023-10-28 11:27:58 26 4
gpt4 key购买 nike

Enum 类是可序列化的,所以用枚举序列化对象没有问题。另一种情况是类具有 java.util.Optional 类的字段。在这种情况下会抛出以下异常:java.io.NotSerializableException: java.util.Optional

如何处理这样的类,如何序列化它们?是否可以将此类对象发送到远程 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);
}
}
}

最佳答案

这个答案是为了回答标题中的问题,“Shouldn't Optional be Serializable?”简短的回答是 Java Lambda (JSR-335) 专家组 considered and rejected it .那张纸条和 this onethis one表明 Optional 的主要设计目标当返回值可能不存在时,将用作函数的返回值。目的是调用者立即检查 Optional并提取实际值(如果存在)。如果该值不存在,调用者可以替换默认值、抛出异常或应用其他一些策略。这通常通过在返回 Optional 的流管道(或其他方法)的末端链接流式方法调用来完成。值(value)观。

它从未打算用于 Optional用于其他方式,例如 optional method arguments或成为 stored as a field in an object .通过扩展,使 Optional可序列化将使其能够持久存储或通过网络传输,这两者都鼓励使用远远超出其原始设计目标。

通常有比存储 Optional 更好的方法来组织数据。在一个领域。如果 getter(例如问题中的 getValue 方法)返回实际的 Optional从字段中,它强制每个调用者实现一些处理空值的策略。这可能会导致调用者之间的行为不一致。通常最好让该字段的任何代码集在设置时应用一些策略。

有时人们想把 Optional到集合中,例如 List<Optional<X>>Map<Key,Optional<Value>> .这通常也是一个坏主意。替换 Optional 的这些用法通常会更好。与 Null-Object值(不是实际的 null 引用),或者只是从集合中完全省略这些条目。

关于java - java.util.Optional为什么不是Serializable,如何用这样的字段序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24547673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com