在研究ATML IEEE1671.1 TestDescription测试描述遇到两个问题:
1,用户如何能够方便快捷的生成标准的Atml文档(Xml序列化)
2,软件如何能够解析标准的Atml文档,还原出TestDescription对象方便后续操作(Xml反序列化)
捣鼓了一阵发现了一个类似JsonSerilialize的工具,针对Xml的序列化与反序列化的工具XmlSerialize
序列化过程与Json差不多,都是从派生类向基类序列化公有字段或者属性,并可以通过标签来影响序列化过程
这里用到TestDescription以及DocumentReference两个类来自于Atml组件中的TestDescription.xsd以及Common.xsd两个XML Schema,至于如何转换.xsd到.cs网上有很多方法,这里不做累赘。
这里我们将构建一个只包含UUT的一个简单的TestDescription实例来研究序列化过程
//添加需要生成的xml中的名称空间以及前缀
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("c", "urn:IEEE-1671:2010:Common");
ns.Add("hd", "urn:IEEE-1671:2010:HardwareCommon");
//创建XmlSerializer并指定类型为IEEE1671.1中的TestDescription
XmlSerializer serializer = new XmlSerializer(typeof(TestDescription));
TestDescription testDescription = new TestDescription();
//添加Common中的元素
testDescription.UUT.Description = new ItemDescriptionReference() { Item = new ATMLModelLibrary.model.common.DocumentReference() { ID = "123", uuid = "A0A7B49E - C227 - 405d - A337 - 991B701FA7CC}" };
StreamWriter writer = new StreamWriter(@"C:\Users\Administrator\Desktop\WorkSpace\ATML\ATML\Demo1671.1.xml");
serializer.Serialize(writer, testDescription, ns);
代码生成的1671.1文档部分如下所示:
<TestDescription xmlns:hd="urn:IEEE-1671:2010:HardwareCommon" xmlns:c="urn:IEEE-1671:2010:Common" xmlns="urn:IEEE-1671.1:2009:TestDescription">
<UUT>
<Description>
<c:DescriptionDocumentReference ID="123" uuid="A0A7B49E - C227 - 405d - A337 - 991B701FA7CC" />
</Description>
生成的文档跟预期效果一致,接下来来解析刚才生成的xml文档
解析过程很简单:
一,创建XmlSerializer对象
二,创建StreamReader对象
三,调用XmlSerialize对象中的Deserialize方法
string filename = @"C:\Users\Administrator\Desktop\WorkSpace\ATML\ATML\Demo1671.1.xml";
XmlSerializer serializer = new XmlSerializer(typeof(TestDescription));
StreamReader reader = new StreamReader(filename);
TestDescription td = (TestDescription)serializer.Deserialize(reader);
ATMLModelLibrary.model.common.DocumentReference reference = td.UUT.Description.Item as ATMLModelLibrary.model.common.DocumentReference;
this.id.Text = reference.ID;
this.uuid.Text = reference.uuid;
reader.Close();
结果与xml文档中的内容一致
总结:序列化与反序列化过程,需要为我们的对象申明各种标签
例如:XmlTypeAttribute(Namespace = "urn:IEEE-1671:2010:Common"),XmlAttributeAttribute(),XmlElementAttribute()等等,幸运的是由.xsd生成.cs过程中已经帮我们添加好了这些标签,直接用即可。