2014-09-11 3 views
4

У меня есть класс, который реализует Serializable. Когда я сериализую члены этого класса, есть определенные переменные/методы, которые я не хочу включать в сериализованное представление.При сериализации объекта, как я могу предотвратить сериализацию определенных членов?

Рассмотрим Name класс, Serializable:

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

    ... 
} 

Предположим, я хочу последовательную форму каждого экземпляра, чтобы исключить middleName свойство.

Есть ли способ, который я могу исключить, чтобы определенные свойства и методы включались в сериализованное представление объекта?

+0

Я думаю, что этот вопрос был неправильно закрыт как «слишком широкий», но я думаю, что это * дубликат [Как я могу создать поле, не связанное с сериализацией в java?] (Http: // stackoverflow.com/q/13687587) – apsillers

+0

Возможный дубликат [Как я могу сделать поле не сериализуемым в java?] (http://stackoverflow.com/questions/13687587/how-can-i-make-a-field-non -serializable-в-Java) – apsillers

ответ

8

Есть ли способ, я могу добиться этого?

Да есть способ. Вы ищете переходный процесс. Вроде так

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 
0

Просто определите их как переходные.

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

переходная ключевое слово используется перед переменными, которых вы не хотите сериализовать

например.

private transient yourvariable; 

, а также переходный косяк быть использован с методами его переменного только

0

Чтобы исключить членов из сериализации определить их как transient.

E.g.

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

b не будет сериализован в данном классе.

Смежные вопросы