2012-03-16 13 views
2

私がしようとしているのは、ネストしたクラスをシリアル化することです。最初の私のコード:私はこのSimleClassシリアライズすると、このC#でネストされたクラスをシリアル化しますか?

<?xml version="1.0"?> 
<SampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
<Person> 
    <Name></Name> 
    <Age></Age> 
</Person> 
<Adress> 
    <Street></Street> 
    <HouseNumber></HouseNumber> 
</Adress> 
</SampleClass> 

のようなXMLを取得したい

[Serializable] 
public class SampleClass 
{ 
    [Serializable] 
    public class Person 
    { 
     [XmlElement("Name")] 
     public string Name { get; set; } 
     [XmlElement("Age")] 
     public ushort Age { get; set; } 
    } 
    [Serializable] 
    public class Adress 
    { 
     [XmlElement("Street")] 
     public string Street { get; set; } 
     [XmlElement("House number")] 
     public int Number { get; set; } 
    } 
    public SampleClass() 
    { 

    } 
    public SampleClass(string _name, byte _age, string _street, int _number) 
    { 
     Person p = new Person(); 
     p.Name = _name; 
     p.Age = _age; 
     Adress a = new Adress(); 
     a.Street = _street; 
     a.Number = _number; 
    } 
} 

using (Stream str = new FileStream(@"C:/test.xml", FileMode.Create)) 
      { 
       XmlSerializer serial = new XmlSerializer(typeof(SampleClass)); 
       SampleClass sClass = new SampleClass("John",15,"Street",34); 
       serial.Serialize(str, sClass); 
       label1.ForeColor = Color.Black; 
       label1.Text = "Ok"; 
      } 

それは私のtest.xmlファイルを与えるのですが、そのファイルの内部は:

<?xml version="1.0"?> 
<SampleClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

私は間違っている?事前のための

感謝:)

答えて

7

はこれです:

Person p = new Person(); 
    p.Name = _name; 
    p.Age = _age; 
    Adress a = new Adress(); 

しかし、これらの変数はローカルです。 それぞれのプロパティを作成し、それらをserializable属性で修飾します。今それは動作します。

public SampleClass(string _name, byte _age, string _street, int _number) 
{ 
    this.Person = new Person(); 
    Person p = this.Person; 
    p.Name = _name; 
    p.Age = _age; 
    this.Adress = new Adress(); 
    Adress a = this.Adress; 
    a.Street = _street; 
    a.Number = _number; 
} 

[Serializable] 
public Person Person { get; set; } 
[Serializable] 
public Adress Adress { get; set; } 

BTW:アドレスは2dです。

+0

'this.Person'はまだインスタンス化されていないため、nullになります。 – cjk

+0

おっと、ありがとう:)お返事ありがとう:) –

2

は、この行は無効です:要素名として

[XmlElement("House number")] 

はそれにスペースを持つことはできません。あなたが本当にシリアライズしたい何

+0

ただし、スペースを削除しても、xmlファイルは他のアイデアから2番目のように見えますか?またはmb私はPerson型とAdress型を取得するプロパティを作成する必要がありますか? – harry180

+0

アルノーFは本当の答えを持っています。実際にあなたが作成した人物と住所をどこにでも教室に割り当てているわけではありません(まだ書いている時点ではまだそれほど正しくありませんでした。 – cjk

4

メインクラスのインスタンスをシリアル化する場合、シリアライザは、オブジェクトグラフにオブジェクトが含まれている場合にのみ、ネストされたクラスのインスタンスをシリアル化します。この点で、ネストされたクラスは他のすべてのクラスとまったく同じです。

基本的にあなたがメインで、ネストされたクラスのプロパティを作成する必要がありますが、空のXMLファイルを取得している1つの

+0

thats回答ありがとう:) – harry180

+1

その後、@ harry180、これは受け入れられた回答ではないはずですか? – JMD

0

理由は、あなたのSampleClassをシリアル化するプロパティがありませんということです。

コンストラクタでは、PersonAddressを作成しています。これらのメソッドは、メソッドが存在するとすぐに破棄され、何も使用しないときに破棄されます。次のようにコードを変更し、より多くの成功を収めてください。

[Serializable] 
public class SampleClass 
{ 
    [Serializable] 
    public class Person 
    { 
     [XmlElement("Name")] 
     public string Name { get; set; } 

     [XmlElement("Age")] 
     public ushort Age { get; set; } 
    } 

    [Serializable] 
    public class Adress 
    { 
     [XmlElement("Street")] 
     public string Street { get; set; } 

     [XmlElement("HouseNumber")] 
     public int Number { get; set; } 
    } 

    public SampleClass() 
    { 
    } 

    public SampleClass(string name, byte age, string street, int number) 
    { 
     this.Person = new Person 
     { 
      Age = age, 
      Name = name  
     }; 

     this.Adress = new Adress 
     { 
      Street = street, 
      Number = number 
     } 
    } 

    public Person Person { get; set; } 
    public Address Address { get; set; } 
} 
関連する問題