【问题标题】:Serialize Nested Classes in c#?在 C# 中序列化嵌套类?
【发布时间】:2012-03-16 12:36:53
【问题描述】:

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

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

我做错了什么?

感谢您的提前:)

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    你真正想要序列化的是这个:

        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 天。

    【讨论】:

    • this.Person 仍然为空,因为它还没有被实例化。
    【解决方案2】:

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

    基本上你必须在主类中为嵌套类创建属性

    【讨论】:

    • 那么,@harry180,这不应该是公认的答案吗?
    【解决方案3】:

    此行无效:

    [XmlElement("House number")] 
    

    因为元素名称中不能有空格。

    【讨论】:

    • 但即使我删除了空间,生成的 xml 文件看起来像第二个 1 从问题任何其他想法?或者 mb 我应该创建可以获取 Person 和 Adress 类型的属性?
    • Arnaud F 有真正的答案 - 你实际上并没有将你创建的 Person 和 Address 分配给任何地方的班级(尽管在撰写本文时他还没有完全正确 - 请参阅我的评论他的回答)。
    【解决方案4】:

    您得到一个空 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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多