我要做的是序列化嵌套类。我的代码首先:
[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" />
我做错了什么?
感谢您提前:)
答案 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
没有要序列化的属性。
在构造函数中,您创建了一个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; }
}