readVersion<EXTERNALIZATION_VERSION_UID> メソッドの例
メソッドは、バージョン/uid マッピングテーブルの各行で生成されますが、ボディは現在のリリースバージョンに一致する uid に対してのみ生成されます。この例では、現在のリリースバージョンは Windchill R9.0 であるので、そのメソッドボディが生成されます。現在のリリースバージョンは、SystemGeneration.jar の release.properties に保存されています。プロパティは、user.properties で設定してもオーバーライドできません。
preserve=maybe タグは、この自動発展生成とともに作成され、ジェネレータがメソッドボディを保持するかを決定するのに役立ちます。その他のメソッドに関しては、特定のメソッドを preserve=yes に変更すると、開発者によって完全に管理できます。
これらの外部化メソッドはリリースに特有なものとして生成される場合、クラスの変更サポートは自動化されますが、開発者が管理する必要がある問題は未解決のままです。最初の問題は、属性 (フィールド) がリリースから除去される場合に発生します。この場合は、古い外部化メソッドはコンパイルされなくなり、存在しないフィールドを参照するので、簡単に処理できます。開発者はフィールドを設定しないようにコードを修正する必要がありますが、古いフィールドはストリームから読み取る必要があります。これを実行しない場合、ランタイム例外が発生します。たとえば、タイトルフィールドがクラスから除去されると、前の readVersion<EXTERNALIZATION_VERSION_UID> メソッドは以下のようにタイトルを読み取る行を変更する必要があります。
/*title = (String)*/input.readObject(); // field to assign no longer exists
2 番目の問題は、属性 (フィールド) が追加される場合に発生します。この場合、コンパイルエラーは発生せず、コードは問題なく逆シリアル化されますが、オブジェクトは無効な状態のままになる可能性があります。開発者はこの可能性があることを把握した上で、オブジェクトが初期化されて有効な状態になるように確認してください。
private boolean readVersion6676079877272797361L( ObjectInput input, long
readSerialVersionUID, boolean superDone )
throws IOException, ClassNotFoundException {
//##begin readVersion6676079877272797361L%readVersion6676079877272797361L.body
preserve=maybe
if ( !superDone ) // if not doing backward compatibility
super.readExternal( input ); // handle super class
a1 = (String)input.readObject();
a2 = (Date)input.readObject();
a3 = (Xyz)input.readObject();
list = (Vector)input.readObject();
String size_string_value = (String)input.readObject();
try { size = (MySize)wt.fc.EnumeratedTypeUtil.toEnumeratedType
( size_string_value
); }
catch( wt.util.WTInvalidParameterException e ) { // old format
size = MySize.toMySize( size_string_value );
}
theOneMoreReference = (ObjectReference)input.readObject();
timeline = (Timeline)input.readObject();
work = (MyAddress)input.readObject();
return true;
//##end readVersion6676079877272797361L%readVersion6676079877272797361L.body
}
これは役に立ちましたか?