Сериализовать вложенные классы в c #? - PullRequest
2 голосов
/ 16 марта 2012

Я пытаюсь сериализовать вложенные классы.Сначала мой код:

[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 ]

7 голосов
/ 16 марта 2012

Что вы действительно хотите сериализовать, так это:

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

Кстати: адрес занимает 2 д.

4 голосов
/ 16 марта 2012

Если вы сериализуете экземпляр основного класса, сериализатор будет сериализовать экземпляр вложенного класса, если и только если граф объектов содержит его.В этом отношении вложенные классы точно такие же, как и у всех других классов.

В основном вам необходимо создать свойства для вложенного класса в главном

2 голосов
/ 16 марта 2012

Эта строка недействительна:

[XmlElement("House number")] 

Поскольку имя элемента не может содержать пробел.

0 голосов
/ 16 марта 2012

Причина, по которой вы получаете пустой XML-файл, заключается в том, что у вашего SampleClass нет свойств для сериализации.

В конструкторе вы создаете Person и Address, которые выбрасываются, как только метод существует, поскольку вы их ни для чего не используете. Измените свой код следующим образом, и вы должны добиться большего успеха.

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