用于异常连接协议的Xml序列化

时间:2010-03-09 19:01:50

标签: c# sockets xml-serialization xmlwriter

在我的应用程序中,我有一个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基本上包含Packet个列表,Packet包含String _CommandString[] _Arguments

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

2 个答案:

答案 0 :(得分:1)

您目前的表现方式是最好的。我会说使用XmlSerializer并使用适当的Xml * Attribute属性修饰Packet和PacketList类的属性来控制输出格式化的方式,但是因为你需要编写对应于集合的属性(p0,p1,p2等) 。)这不起作用。

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

安德鲁

答案 1 :(得分:1)

我是安德鲁的回答。

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