【问题标题】:When serializing an object, how can I prevent serialization of particular members?序列化对象时,如何防止特定成员的序列化?
【发布时间】:2014-09-11 12:13:45
【问题描述】:

我有一个实现Serializable 的类。当我序列化该类的成员时,我不希望将某些变量/方法包含在序列化表示中。

考虑一个Name 类,即Serializable

class Name implements Serializable {
    private String firstName;
    private String middleName;
    private String lastName;

    ...
}

假设我希望每个实例的序列化形式排除middleName 属性。

有什么方法可以排除特定的属性和方法,使其不包含在对象的序列化表示中?

【问题讨论】:

标签: java serialization


【解决方案1】:

有什么方法可以实现吗?

是的有一个方法。您正在寻找瞬态。像这样

private transient x;

要将您创建的所有对象变量添加到其中,请转换为持久状态。因此,当您将这些变量声明为瞬态时,它将不会被持久化。这就是transient关键字的主要用途。

来自Java docs

变量可能被标记为瞬态以表明它们不是一部分 对象的持久状态。

Example from source:

package javabeat.samples;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class NameStore implements Serializable{
    private String firstName;
    private transient String middleName;
    private String lastName;
    public NameStore (String fName,
                         String mName,
                         String lName){
        this.firstName = fName;
        this.middleName = mName;
        this.lastName = lName;
    }
    public String toString(){
        StringBuffer sb = new StringBuffer(40);
        sb.append("First Name : ");
        sb.append(this.firstName);
        sb.append("Middle Name : ");
        sb.append(this.middleName);
        sb.append("Last Name : ");
        sb.append(this.lastName);
        return sb.toString();
    }
}
public class TransientExample{
    public static void main(String args[]) throws Exception {
        NameStore nameStore = new NameStore("Steve",
                                     "Middle","Jobs");
        ObjectOutputStream o = new ObjectOutputStream
                   (new FileOutputStream("nameStore"));
        // writing to object
        o.writeObject(nameStore);
        o.close();

        // reading from object
        ObjectInputStream in =new ObjectInputStream(
                new FileInputStream("nameStore"));
        NameStore nameStore1 = (NameStore)in.readObject();
        System.out.println(nameStore1);
    }
}

// 输出将是:

First Name : Steve
Middle Name : null
Last Name : Jobs

【讨论】:

    【解决方案2】:

    只需将它们定义为瞬态。

    private String serializedField; // gets serialized
    private transient String field; // doesn't get serialized
    

    【讨论】:

      【解决方案3】:

      要排除成员被序列化,请将其定义为transient

      例如

      public class A extends Serializable {
          private int a;
          private transient int b;
      }
      

      b 不会在这个类中被序列化。

      【讨论】:

        【解决方案4】:

        transient 关键字用在你不想被序列化的变量之前

        例如。

        private transient yourvariable;
        

        瞬态也不能与仅用于变量的方法一起使用

        【讨论】:

          【解决方案5】:

          在数据成员之前声明瞬态或静态以排除特定数据成员的序列化

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 2013-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多