2016-12-31 2 views
0

XMLEncoderはオブジェクトのコンストラクタにプロパティが設定されていることを知っているため、出力しません。 、オブジェクトをインスタンス化し、メイン今XMLEncoder writeObjectはコンストラクタで初期化されたプロパティをスキップします

public class Simple { 
int m; 
int n; 

public int getM() { return m;} 
public void setM(int m) {this.m = m;} 
public int getN() {return n;} 
public void setN(int n) {this.n = n; } 

public String toString() { 
    return "m=" + m + ",n=" + n; 
} 

public Simple() { 
    this.m = 1; 
    this.n = 2; 
}  
} 

、: まずゲッターとセッターとデフォルトコンストラクタで単純なオブジェクトを定義します。

はここで、これは実証(Javaの1.8上で実行)簡単な例でありますプロパティの1つでセッターを使用し、最終オブジェクトでXMLEncoderを呼び出します。私はまた、エンコーダを起動する前に、オブジェクトのプロパティを印刷してくださいするには: M = 1、N = 7 しかし、私は、生成されたファイルを見て、:

public class Main { 

public static void main(String[] args) { 
    Simple simple = new Simple(); 

    simple.setN(7); 
    System.out.println(simple.toString()); 

    XMLEncoder encoder=null; 
    try{ 
     encoder=new XMLEncoder(new BufferedOutputStream(
         new FileOutputStream("simple.xml"))); 
    }catch(FileNotFoundException fileNotFound){ 
     System.out.println("ERROR: While Creating the File "); 
    } 
    encoder.writeObject(simple); 
    encoder.close(); 
    } 
} 

は、プログラムを実行すると、私が期待される出力を得ます私が取得:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.8.0_112" class="java.beans.XMLDecoder"> 
<object class="simple.Simple"> 
    <void property="n"> 
    <int>7</int> 
    </void> 
</object> 
</java> 

は、ここでは、オブジェクトの前のプリントアウトは、両方のプロパティは、その値が設定されていることを示しているのに対し、唯一のプロパティは、出力は、XMLEncoderであることがわかります。 XMLEncoderにはクリスタルボールがあり、過去に何が起こったかを知っているかのようです!

+0

その選択性を説明し、それは両方のnとmの出力を持つことができますが、それは唯一の財産 –

答えて

0

実際には記憶喪失と同じように、nとmの両方を出力することができますが、セッターの影響を受けた1つのプロパティだけが出力されます。

しかしOfficial doc

は、構造的にコンパクト言う: Beanのプロパティのデフォルト値がストリームに書き込まれないようXMLEncoderクラスは内部で冗長性 除去アルゴリズムを使用しています。

それは記憶喪失を持っているかのように、それは逆に見える

+0

ああヘクタールを印刷しました!これは意味があります。つまり、XMLDecoderを使用してファイルをデコードすると、オブジェクトのインスタンス化によってコンストラクタ内のプロパティが初期化され、外に設定されたオブジェクトのみが上書きされます。 –

+0

はい、正確です。良い最適化、それほど明白ではない –

+0

もう少し考えた後、私はこの問題の問題を抱えています。 XMLEncoderを使用して特定のプロパティを持つファイルを保存し、オブジェクトコンストラクタのデフォルト値を変更し、元のファイルでXMLDecoderを実行すると、前回の実行時とは異なる値がオブジェクトに表示されます。これについてはわかりません。 –

関連する問題