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

时间:2011-09-05 13:35:53

标签: java serialization pojo

我想在文件中以名称值字符串格式序列化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}

1 个答案:

答案 0 :(得分:3)

对于自定义java序列化, 您应该看一下覆盖readObject()和writeObject()方法。如果覆盖了这些方法,则Serialization api会调用这些方法而不是执行默认的序列化。 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;
   }

}