【发布时间】:2011-05-23 08:00:29
【问题描述】:
XmlSerialiser 是否可以/应该用于反序列化以下第 3 方定义的与 xml“类似”的消息协议?
协议指定了一些消息,一些包含一些属性,而另一些则没有,例如协议 A
- GetEvent 消息将作为字符串
<GetEvent></GetEvent>传输 - 将使用 2 个参数作为字符串
<AckEvent>1234,888</AckEvent>传输 AckEvent 消息
我想使用 XDocument 对类进行反序列化/序列化(理想情况下,类将从 xsd 文件生成),例如
class GetEvent{}
class AckEvent{int ID; int Type;}
但是没有属性的类会使用“最小化”结束标签进行序列化:<GetEvent />,这是协议不允许的。
此外,相同的第 3 方设备还有另一个接口,该接口略有不同,属性将包含在标签中,例如协议 B:
带有参数的 SomeOtherEvent 消息将作为字符串传输
<SomeOtherEvent><ID>1234</ID><TYPE>999</TYPE></SomeOtherEvent>
我可以使用以下方法序列化这些:
public static XDocument Serialize<T>(T source)
{
XDocument target = new XDocument();
XmlSerializer s = new XmlSerializer(typeof(T));
System.Xml.XmlWriter writer = target.CreateWriter();
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
s.Serialize(writer, source, ns);
writer.Close();
return target;
}
但是对于没有参数的消息,仍然存在最小化结束标记的问题。
- 如何指定协议 A 属性被序列化为逗号分隔值而不是包含在标签中?
- 如何指定“非最小化”结束标记用于没有任一协议参数的消息?
- 是使用适合上述情况的 XmlSerialisation 框架还是 XML 不够?如果不是,那么最简单最干净的方法是什么?
【问题讨论】:
标签: c# xml serialization .net-4.0 xml-serialization