在c#中序列化嵌套类?

时间:2012-03-16 12:36:53

标签: c# xml serialization xml-serialization

我要做的是序列化嵌套类。我的代码首先:

[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" />

我做错了什么?

感谢您提前:)

4 个答案:

答案 0 :(得分: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:地址需要2天。

答案 1 :(得分:4)

如果序列化主类的实例,当且仅当对象图包含一个实例时,序列化程序才会序列化嵌套类的实例。在这方面,嵌套类与所有其他类完全相同。

基本上你必须在主要的

中为嵌套类创建属性

答案 2 :(得分:2)

此行无效:

[XmlElement("House number")] 

由于元素名称中不能包含空格。

答案 3 :(得分:0)

您获取空XML文件的原因是您的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; }
}