2012-03-16 40 views
2

我想要做的是序列化嵌套類。我的代碼第一:在c#中序列化嵌套類?

[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; 
    } 
} 

我想這樣的XML

<?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> 

當我序列化此SimleClass:

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(); 

但是這些變量是局部的。 創建每個屬性並用可序列化屬性對它們進行裝飾。現在它會工作。

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; } 

順便說一句:地址需要2 d。

+0

'this.Person'仍然是空的,因爲它沒有被實例化。 – cjk 2012-03-16 12:44:00

+0

哎呀,錯過了,謝謝:) – 2012-03-16 12:45:33

2

此行是無效的:

[XmlElement("House number")] 

作爲一種元素名稱不能有空格。

+0

但即使當我刪除空間那裏生成的XML文件看起來像第二個問題任何其他想法?或MB我應該使屬性,將獲得個人和地址類型? – harry180 2012-03-16 12:42:55

+0

Arnaud F有真正的答案 - 你實際上並沒有把你創建的人和地址分配給任何地方的班級(儘管在撰寫本文時他仍然沒有完全正確 - 請參閱我對他的回答的評論)。 – cjk 2012-03-16 12:44:46

4

如果序列化主類的實例,序列化程序將序列化嵌套類的實例當且僅當對象圖包含一個實例。在這方面,嵌套類與所有其他類完全相同。

基本上你有你得到一個空的XML文件中最主要的一個

+0

這就是答案謝謝:) – harry180 2012-03-16 12:47:45

+1

然後,@ harry180,這不應該被接受的答案? – JMD 2016-03-29 20:03:28

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; } 
}