【问题标题】:Xml Serialization for Unusual Connection Protocol异常连接协议的 Xml 序列化
【发布时间】:2010-03-09 19:01:50
【问题描述】:

在我的应用程序中,我有一个 PacketList 类和 Packet 类。我希望能够使用PacketList 上的序列化助手来提供所需的输出,但不知道该往哪个方向发展。

我正在编写一个程序来模拟具有特殊协议的服务器来发送数据。

客户端发送的数据格式为:COMMAND|ARGUMENT_0|ARGUMENT_1|ARGUMENT_2|...|ARGUMENT_N\0。其中COMMAND 可能类似于MOVELOGIN

服务器将以以下格式响应:

<p c='COUNT'>
    <m p='N' p0='COMMAND_0' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    <m p='N' p0='COMMAND_1' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    <m p='N' p0='COMMAND_2' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    <m p='N' p0='COMMAND_3' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
    ...
    <m p='N' p0='COMMAND_COUNT' p1='ARUGMENT_0' ... pN='ARGUMENT_N'/>
</p>

COMMAND_0 可能类似于 UPDATE_POSITIONAUTHENTICATED

是的,这是一种愚蠢的做事方式。不,我不知道为什么会这样。不,我不能改变它。

无论如何,我希望模拟服务器将数据包发送回客户端的方式。到目前为止我得到的是:

XmlWriterSettings _Settings = new XmlWriterSettings {
    OmitXmlDeclaration = true,
    Indent = true
};
StringBuilder _Xml = new StringBuilder();
XmlWriter _Writer = XmlWriter.Create(_Xml, _Settings);
_Writer.WriteStartElement("p");
    _Writer.WriteAttributeString("c", "1");
    _Writer.WriteStartElement("m");
        _Writer.WriteAttributeString("p", "2");
        _Writer.WriteAttributeString("p0", "COMMAND");
        _Writer.WriteAttributeString("p1", "ARGUMENT_0");
        _Writer.WriteAttributeString("p2", "ARGUMENT_1");
    _Writer.WriteEndElement(); // </m>
_Writer.WriteEndElement(); // </p>
_Writer.Flush();
Console.WriteLine(_Xml.ToString());

这可以正常工作并输出:

<p c="1">
  <m p="2" p0="COMMAND" p1="ARGUMENT_0" p2="ARGUMENT_1" />
</p>

但是,我想以更简洁的方式实现它。

我的PacketList 基本上包含Packets 的列表,而Packet 包含String _CommandString[] _Arguments

如果有人能指导我正确的方向,将不胜感激。

【问题讨论】:

    标签: c# sockets xml-serialization xmlwriter


    【解决方案1】:

    你目前的做法是最好的。我会说使用 XmlSerializer 并使用适当的 Xml*Attribute 属性装饰您的 Packet 和 PacketList 类的属性以控制输出格式的方式,但是由于您需要编写与集合相对应的属性(p0、p1、p2 等.) 这行不通。

    既然你需要编写这么奇怪的格式,那么按照你现在的方式手动编写它是有意义的。

    安德鲁

    【讨论】:

    • 我认为我的方向是正确的,但它太复杂了,我认为它不可能是正确的。感谢您的意见。
    【解决方案2】:

    我赞同安德鲁的回答。

    AFAIK,除非您编写自己的序列化程序,否则无法做到这一点,因为您将两个级别的数据元素(具有动态数量的元素!)作为 属性 组合在单个 XML 元素中。这样做没有任何意义,而且,XmlSerializer 需要一些意义才能仅使用反射来工作。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2011-08-26
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多