我正在尝试将一些xml文件反序列化为一些已简化为以下类的类:
[XmlRoot("person")]
[Serializable]
public class Person
{
[XmlElement]
public Toy Toy { get; set; }
}
[Serializable]
public class ActionMan : Toy
{
[XmlElement("guns")]
public string Guns;
}
[Serializable]
public class Doll : Toy
{
[XmlElement("name")]
public String Name;
}
[XmlInclude(typeof(Doll))]
[XmlInclude(typeof(ActionMan))]
public class Toy
{
}
[TestFixture]
public class ToyTest
{
[Test]
public void testHierarchy()
{
String filePath = @"test\brother.xml";
String sisfilePath = @"test\sister.xml";
var serializer = new XmlSerializer(typeof(Person));
Person brother = (Person)serializer.Deserialize(new FileStream(filePath, FileMode.Open));
Person sister = (Person)serializer.Deserialize(new FileStream(sisfilePath, FileMode.Open));
Assert.IsNotNull(brother);
Assert.IsNotNull(sister);
Assert.IsAssignableFrom(typeof(ActionMan),brother.Toy);
Assert.IsAssignableFrom(typeof(Doll),sister.Toy);
}
}
我想使用c#Serialization(我知道我可以使用自己的deserialiser),我想我可能只是错过了一个我不知道的特定标签(我确信我已经多余了)标签)。
这是一个xml文件:
<person>
<doll>
<name>Jill</name>
</doll>
</person>
我得到的错误是第三个断言上的“预期:可分配”
答案 0 :(得分:1)
班级人员应该包含“娃娃”属性而不是“玩具”属性,我的意思是名称。 XML节点必须与属性名称具有相同的名称-casing。
答案 1 :(得分:1)
当我尝试序列化您的结构(人,将ActionMan作为玩具)时,我得到了
<person> <Toy xsi:type="ActionMan" /> </person>
我想这就是你如何处理你的类型的继承。 但我想你无法改变已经序列化的XML。
答案 2 :(得分:1)
我所做的,是按照我想要的方式设计类结构,填写一些基本数据然后序列化。然后检查它如何序列化和调整Xml属性。如果你的Toy
类只有一些衍生物,那么你可以使用action-man字段和可能为null或不为null的doll字段单独对它们进行反序列化。
或者从Xml文件转到ac #class我使用xsd.exe
工具生成.xsd
文件xsd mydata.xml
,然后使用{{1}生成#c}类文件}}。然后我检查类数据,以获得有关如何定义我的类以及使用哪些属性的线索。
链接到Microsoft的xsd工具。
答案 3 :(得分:0)
尝试以下
public class Person
{
public Toy toy
{
get
{
return (doll == null) ? (Toy)actionMan : (Toy)doll;
}
}
public Doll doll;
public ActionMan actionMan;
}
public class Toy
{
}
public class Doll : Toy
{
public String name;
}
public class ActionMan : Toy
{
public String guns;
}
class Program
{
static void Main(string[] args)
{
Person brother = new Person();
ActionMan am = new ActionMan();
am.guns = "Laser Beam";
brother.actionMan = am;
Person sister = new Person();
Doll d = new Doll();
d.name = "Jill";
sister.doll = d;
Serialize(brother, "brother.xml");
Serialize(sister, "sister.xml");
Person b = Deserialize("brother.xml");
Person s = Deserialize("sister.xml");
Console.WriteLine(((ActionMan)b.toy).guns);
Console.WriteLine(((Doll)s.toy).name);
Console.Read();
}
public static Person Deserialize(String filename)
{
var serializer = new XmlSerializer(typeof(Person));
return (Person)serializer.Deserialize(new FileStream(filename, FileMode.Open));
}
public static void Serialize(Person p, String filename){
Stream stream = File.Open(filename, FileMode.Create);
XmlSerializer s = new XmlSerializer(typeof(Person));
s.Serialize(stream, p);
stream.Close();
}
您可以从此处展开。请记住,在属性名称中,外壳很重要。我得到的序列化输出是
brother.xml
<?xml version="1.0"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<actionMan>
<guns>Laser Beam</guns>
</actionMan>
</Person>
sister.xml
<?xml version="1.0"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<doll>
<name>Jill</name>
</doll>
</Person>
输出
Laser Beam
Jill