2016-06-22 4 views
0

私は従業員クラスがあります。この従業員クラスのシリアル化されたオブジェクトのクラスにフィールドを追加することはできますか?

class Employee implements Serializable{ 
    int empId; 
    String empName; 
    double salary; 
} 

一つの目的は、シリアル化され、いくつかのファイルに保存されているが

employee.ser私は既存の従業員クラスに1つの以上のフィールドを追加したいと言います。今私の従業員クラスは、この

class Employee implements Serializable{ 
    int empId; 
    String empName; 
    double salary; 
    String state="abc"; 
} 

ようになります、それは国家のデフォルト値を有するように、古いオブジェクトをデシリアライズすることは可能ですか?

可能であれば、どうすればよいですか?

+0

私は完全にはわかりませんが、シリアルバージョンIDに基づいて行うことができます。したがって、最初の従業員IDではシリアルバージョンIDが1であったとし、更新されたクラスではシリアルバージョンIDは2となります。デシリアライザを実装してシリアルバージョンIDを確認し、それに基づいてフィールドを更新します。 – Jaiprakash

+0

@Jaiprakashいいえ、できません。 'serialVersionUID'を変更すると、あなたのコードが実行されるずっと前に例外が発生します。そのため、変更しないでください。 – EJP

+0

はい、カスタムデシリアライザを使用して行うことができます。手順は次のとおりです。1. serialVersionUIDを変更しないでください。ステップ2:カスタムデシリアライザを実装します。サンプルコード:クラスCustomDesrializerはObjectInputStreamの{ \t \t公共CustomDesrializer(FileInputStreamのfileInが)のIOException {スーパー(fileIn)をスロー延び;} \t \t \t \t公務員customReadObjectは()にClassNotFoundExceptionは、IOException { \t \t \t社員OBJ =を(スロー従業員)super.readObject(); \t \t \t場合(obj.state == NULL)obj.state = "ABC" \t \t \t \t。 \t \t \t return obj; \t \t} \t} –

答えて

1

はい。フィールドを追加または削除することができます。 Object Versioning chapter of the Object Serialization Specificationを参照してください。 serialVersionUIDは必ず同じ値にしてください。ただし、デシリアライズ時にコンストラクタや初期化コードが実行されないため、デフォルト値の適用はあなた次第です。

関連する問題