2011-05-23 55 views
2

可以/应该使用XmlSerialiser来解析/序列化与xml'类似'的以下第三方定义的消息协议吗?将c#中的“几乎”xml字符串序列化到类#

该协议指定了一些消息,一些包含其他人不需要的属性,例如,协议A

  • 甲GetEvent消息将被转移为字符串<GetEvent></GetEvent>
  • 甲AckEvent消息是与2个PARAMS作为字符串被转移<AckEvent>1234,888</AckEvent>

我想用的XDocument做去/从类的序列化(理想情况下,这些类将从一个xsd文件生成),例如

class GetEvent{} 
class AckEvent{int ID; int Type;} 

,但没有属性的类得到初始化一个“最小化”关闭标签:<GetEvent />未被协议允许的。另外,相同的第三方设备具有另一个稍有不同的界面,因为这些属性将被包含在标签中,例如,方案B:

使用参数甲SomeOtherEvent消息将被转移为字符串 <SomeOtherEvent><ID>1234</ID><TYPE>999</TYPE></SomeOtherEvent>

我可以使用serialize这些:

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

但是仍然有最小化的结束标记的问题而没有PARAMS消息。

  • 如何指定Protocol A属性被序列化为逗号分隔值而不是被封装在标记中?
  • 如何为任一协议指定“不最小化”结束标记用于没有参数的消息?
  • 正在使用适用于上述的XmlSerialisation框架还是XML不够?如果不是最简单的最简洁的方法?

回答

0

.Net XML类只能使用格式良好的XML。如果这个“类似XML”的方案不完整,你将不得不推出自己的方案。

这个wikipedia article有关于良构的一些基本规则。有关完整的定义,请参阅specification