2012-02-01 1 views
2

私はXMLファイルにいくつかのデータを入れようとしています。ここでは、コードは次のようになります。XmlEncoderがクラスのメンバーをXMLファイルに挿入しないのはなぜですか?

@Test 
public void TestProximities() { 

    // Create a proximity 
    ISpaceComponent solarSystem = Init.createSolarSystemProximities(); 
    solarSystem.runTtest(); 

    Path filePath = Paths.get("c:\\temp\\junk.bin"); 

    File xmlFile = new File("c:\\temp\\"); 
    boolean success = xmlFile.mkdirs(); 
    if (!success && ! xmlFile.exists()) { 
     // Directory creation failed 
     System.out.println("Failed to create a file: " + filePath); 
    } 

    try { 
     XMLEncoder fileXml = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("c:\\temp\\junk.xml"))); 
     fileXml.writeObject(solarSystem); 
     fileXml.flush(); 
     fileXml.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println(e.getMessage()); 

    } 

} 

Init.createSolarSystemProximities():

public static ISpaceComposite createSolarSystemProximities() { 

    // Proximities 
    ISpaceComposite solarSystem = new SpaceComposite("The Solar System"); 
    solarSystem.addComponent(new Star("Sol"));  

    ISpaceComposite MercuryProximity = new SpaceComposite("Mercury proximity"); 
    MercuryProximity.addComponent(new Planet("Mercury")); 
    solarSystem.addComponent(MercuryProximity); 

    ISpaceComposite VenusProximity = new SpaceComposite("Venus proximity"); 
    VenusProximity.addComponent(new Planet("Venus")); 
    solarSystem.addComponent(VenusProximity); 

    ISpaceComposite EarthProximity = new SpaceComposite("Earth proximity"); 
    EarthProximity.addComponent(new Planet("The Earth")); 
    EarthProximity.addComponent(new Moon("The Moon")); 
    solarSystem.addComponent(EarthProximity); 

    ISpaceComposite MarsProximity = new SpaceComposite("Mars proximity"); 
    MarsProximity.addComponent(new Planet("Mars")); 
    MarsProximity.addComponent(new Moon("Phobos")); 
    MarsProximity.addComponent(new Moon("Deimos")); 
    solarSystem.addComponent(MarsProximity); 

    return solarSystem; 

} 

そして、空間複合クラスは次のように探しています:

public class SpaceComposite extends SpaceComponent implements ISpaceComposite { 
    public static final long serialVersionUID = Data.serialVersionUID; 
    private ArrayList<ISpaceComponent> _components; 
private int _currentMoonIndex; 

} 

また 'SpaceCompositeは、' デフォルトのprameterlessのコンストラクタを持っています。しかし、ファイルに挿入されている唯一のことは、その名前であり、「SpaceComponent」クラスから

public abstract class SpaceComponent implements ISpaceComponent, Serializable{ 
    private String _title; 
    public static final long serialVersionUID = Data.serialVersionUID; 

    // Default constructor 
    public SpaceComponent(){ 
     _title = ""; 
    } 
} 

どのように私はこの問題を解決することができますがderrived?

答えて

1

XmlEncoderは、JavaBeanの規約を使用してプロパティを取得します。これは、オブジェクトグラフを複製し、クローンを作成するために必要なステップを記録することによって機能します。カスタマイズしないでXmlEncoderで使用したいクラスは、JavaBeansの規約に従う必要があります(プロパティの場合はgetXYZ/setXYZ、ブール値のプロパティの場合はisAbc/setAbcなど)。私の推測では、あなたのクラスの唯一のプロパティはNameです。 1つだけシリアル化されます。

この記事の記事では、独自の永続デリゲートを提供することによってプロセスをカスタマイズする方法についても説明していますが、getters/settersを追加して最初に動作させることができます。

+0

プライベートアクセス修飾子を使用しているセッターを宣言できますか?私はサードパーティのコードの私的なメンバーに完全にアクセスしたくないので、それが必要です – Eugene

+0

@Eugene真実を伝えるために、私は 'XMLEncoder'の経験はあまりありませんが、私は間違いなくprivate外界に露出したくない私のセッターのためのパッケージの可視性。 – dasblinkenlight