0

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

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

客户端发送格式为: 的数据COMMAND|ARGUMENT_0|ARGUMENT_1|ARGUMENT_2|...|ARGUMENT_N\0。哪里COMMAND可能像MOVEor LOGIN

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

<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_POSITIONor AUTHENTICATED

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

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

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>

但是,我想以更清洁的方式实现这一点。

MyPacketList基本上包含一个Packets 列表,并Packet包含一个String _CommandString[] _Arguments.

如果有人能引导我朝着正确的方向前进,将不胜感激。

4

2 回答 2

1

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

由于您需要编写如此奇怪的格式,因此按照您当前的方式手动编写它是有意义的。

安德鲁

于 2010-03-09T19:23:24.780 回答
1

我赞同安德鲁的回答。

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

于 2010-03-09T19:33:53.757 回答