【问题标题】:Store object in customized serializable form以自定义的可序列化形式存储对象
【发布时间】:2011-09-05 13:35:52
【问题描述】:

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


    【解决方案1】:

    对于自定义 java 序列化, 您应该查看覆盖 readObject() 和 writeObject() 方法。如果这些方法被覆盖,序列化 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;
       }
    

    }

    【讨论】:

    • 您能否详细说明上述示例的 readObject() 和 writeObject() 方法的 sn-p?
    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多