gpt4 book ai didi

java - 以自定义的可序列化形式存储对象

转载 作者:行者123 更新时间:2023-11-29 06:09:51 24 4
gpt4 key购买 nike

我想在文件中以名称值字符串格式序列化一个 POJO。当我读回字符串时,我想要回 POJO。我只能考虑为此自定义序列化实现 writeReplace() 和 readResolve() 方法。有没有其他/更好的方法来做到这一点?

假设我的POJO是这样的

class myPOJO(){
private String attribute1;
private String attribute2;

public myPOJO(String value1, String value2){
attribute1 = value1;
attribute2 = value2;
}

public String getAttribute1(){
return attribute1;
}

public void setAttribute1(String value){
attribute1 = value;
}

public String getAttribute2(){
return attribute2;
}

public void setAttribute2(String value){
attribute2 = value;
}
}

所以我希望将其以字符串格式序列化为

{attribute1:value1;attribute2:value2}

最佳答案

对于自定义java序列化,您应该查看重写 readObject() 和 writeObject() 方法。如果这些方法被覆盖,Serialization api 将调用这些方法而不是执行默认的 Serialization。readResolve() 和 writeReplace() 方法有不同的用法,例如当你序列化单例时,你需要 readResolve() 来反序列化。请引用 JDK (arrayList) 中的以下真实示例

Java ArrayList readResolve()

但是,如果您的 POJO 的物理表示与逻辑表示相同,那么您也可以使用默认序列化而不会出现任何问题。

对于你上面的POJO,你可以通过以下方式进行序列化

class myPOJO implements Serializable{
private static final long serialVersionUID = 8683452581122892189L;
transient private String attribute1;
transient private String attribute2;

public myPOJO(String value1, String value2){

attribute1 = value1;
attribute2 = value2;
}

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
//always do defaultWriteObject. Helps in few Edge cases
s.defaultWriteObject();
s.writeObject(attribute1);
s.writeObject(attribute2);
}
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException{
//always do defaultReadObject. Helps in few Edge cases.
s.defaultReadObject();
attribute1 = (String) s.readObject();
attribute2 = (String) s.readObject();
}
public String getAttribute1(){
return attribute1;
}

public void setAttribute1(String value){
attribute1 = value;
}

public String getAttribute2(){
return attribute2;
}

public void setAttribute2(String value){
attribute2 = value;
}

关于java - 以自定义的可序列化形式存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308880/

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