【问题标题】:Serialize classes to 'almost' xml strings in c#在 C# 中将类序列化为“几乎”xml 字符串
【发布时间】: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


    【解决方案1】:

    尝试使用XmlElement attribute

    【讨论】:

    【解决方案2】:

    .Net XML 类只能使用格式良好的 XML。如果这种“类似 XML”的方案格式不正确,您将不得不自己动手。

    这个wikipedia article 有一些关于格式良好的基本规则。完整定义见specification

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多