《Java 8 in action》P212扩展
目录
如何解决:属性不设置为Optional类型,其get方法设置为Optional类型
Optional对象不支持序列化,示例如下:
import java.io.*;
import java.util.Optional;
public class SerializeTest implements Serializable {
private Optional<String> name;
private Integer age;
public Optional<String> getName() {
return name;
}
public void setName(Optional<String> name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public static void main(String[] args) throws Exception {
SerializeTest test = new SerializeTest();
test.setName(Optional.of("test_name"));
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data"));
//序列化时name字段是Optional类型,不支持序列化,报如下异常:
//Exception in thread "main" java.io.NotSerializableException: java.util.Optional
out.writeObject(test);
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data"));
SerializeTest obj = (SerializeTest) in.readObject();
Optional<String> name = obj.getName();
Integer age = obj.getAge();
System.out.println(name);
System.out.println(age);
}
}
如何解决:属性不设置为Optional类型,其get方法设置为Optional类型
import java.io.*;
import java.util.Optional;
public class SerializeTest2 implements Serializable {
private String name;
private Integer age;
public Optional<String> getName(){
return Optional.ofNullable(this.name);
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public static void main(String[] args) throws Exception {
SerializeTest2 test = new SerializeTest2();
test.setName("test_name");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data"));
out.writeObject(test);
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data"));
SerializeTest2 obj = (SerializeTest2) in.readObject();
Optional<String> name = obj.getName();
Integer age = obj.getAge();
System.out.println(name);//Optional[test_name]
System.out.println(age);//null
}
}