2012-03-16 37 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; } 
}