Lớp Enum là Serializable nên không có vấn đề gì khi serialize đối tượng với enum. Trường hợp khác là lớp có các trường thuộc lớp java.util.Optional. Trong trường hợp này, ngoại lệ sau được ném ra: java.io.NotSerializableException: java.util.Optional
Làm thế nào để đối phó với các lớp như vậy, làm thế nào để tuần tự hóa chúng? Có thể gửi các đối tượng như vậy đến EJB từ xa hoặc thông qua RMI không?
Đây là ví dụ:
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);
}
}
}
NotSerializableException,
khóa học.
Optional
được đánh dấu làSerializable
, thì điều gì sẽ xảy ra nếuget()
trả về thứ gì đó không thể tuần tự hóa?