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

标签 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}

最佳答案

对于自定义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/

相关文章:

Android DiffUtil.ItemCallback areContentsTheSame 不同ID

java - Apache Pivot 1.4 与 JavaFX、Flex、Silverlight、Swing

Java String.replaceAll 正则表达式

haskell - 用户损坏、Data.Binary 损坏或安装损坏?

java - 使用 GSON 序列化/反序列化 json/对象时的默认值

java - 如何将DTO解析为Pojo对象

java - 让 Spring DispacherServlet 解析正确的 URLmap

java - 当没有强大的网络时,Android RactiveNetwork 崩溃应用程序

c# - 一次构建一个 DateTime

pojo 类的 Hibernate 表