2

Java には、シリアライズしてはならない値を示すためにデフォルトのシリアライゼーションで使用される一時的なキーワードがあります。ただし、XMLDecoder で XML シリアル化を使用すると、そのフィールドに関連付けられたプロパティはシリアル化されたままになります。Gsonライブラリを使用してJSONで同じことを試しましたが、一時的なフィールドは適切にスキップされているようです。

理由はありますか?

4

1 に答える 1

3

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ます。

于 2014-09-17T12:01:45.487 に答える