Java には、シリアライズしてはならない値を示すためにデフォルトのシリアライゼーションで使用される一時的なキーワードがあります。ただし、XMLDecoder で XML シリアル化を使用すると、そのフィールドに関連付けられたプロパティはシリアル化されたままになります。Gsonライブラリを使用してJSONで同じことを試しましたが、一時的なフィールドは適切にスキップされているようです。
理由はありますか?
Java には、シリアライズしてはならない値を示すためにデフォルトのシリアライゼーションで使用される一時的なキーワードがあります。ただし、XMLDecoder で XML シリアル化を使用すると、そのフィールドに関連付けられたプロパティはシリアル化されたままになります。Gsonライブラリを使用してJSONで同じことを試しましたが、一時的なフィールドは適切にスキップされているようです。
理由はありますか?
XML エンコーダー/デコーダーは、@XMLTransient
注釈を優先します。
キーワードは、transient
最終的にバイト シーケンスになる Java オブジェクトのシリアル化プロセス用です。XML の「シリアル化」は、書式設定されたテキスト ドキュメントになります。シリアル化しないフィールドを選択すると (マークを付けてtransient
)、さまざまな側面がある可能性があります。また、出力がまったく異なるため、除外したいさまざまなフィールドを選択して自分で処理したい場合があります。たとえば、Java シリアライゼーションの場合、a をシリアライズするbyte[]
ことを選択するとよいでしょう。これは簡単でわかりやすいからです。XML の場合、そのバイト配列の作成に使用されたオブジェクトがより適切で意味のあるテキスト表現を持っている場合は、そのオブジェクトをシリアル化することができます。
@XMLTransient
によって使用されJAXB
ます。XMLEncoder
フィールドを除外する (一時的なものとしてマークする) には、"transient"
プロパティをTRUE
: PropertyDescriptor
( source )に設定する必要があります。
BeanInfo info = Introspector.getBeanInfo(JTextField.class);
PropertyDescriptor[] propertyDescriptors =
info.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; ++i) {
PropertyDescriptor pd = propertyDescriptors[i];
if (pd.getName().equals("text")) {
pd.setValue("transient", Boolean.TRUE);
}
}
それはエレガントなソリューションではありません。JAXB
代わりにを使用することもできXMLEncoder
ます。