0

私のアプリケーションには、PacketListクラスとPacketクラスがあります。PacketListシリアル化ヘルパーを使用して、目的の出力のようなものを考え出すことができるようにしたいと思いますが、どの方向に進むべきかわかりません。

私は、データを送信するための独特のプロトコルを持つサーバーを模倣するプログラムを書いています。

クライアントは次の形式でデータを送信します:COMMAND|ARGUMENT_0|ARGUMENT_1|ARGUMENT_2|...|ARGUMENT_N\0COMMANDまたはのようなものはどこにあります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含み、aString _Commandとを含みますString[] _Arguments

誰かが私を正しい方向に導くことができれば、それは大いにありがたいです。

4

2 に答える 2

1

アンドリューの答えを2番目に。

AFAIK、単一のXML要素の属性として2つのレベルのデータ要素(動的な数の要素を含む!)を構成するため、独自のシリアライザーを作成しない限り、それを行う方法はありません。それを行う意味はありません。XmlSerializerは、Reflectionだけを使用して機能するために、ある程度の意味が必要です。

于 2010-03-09T19:33:53.757 に答える
1

今やっている方法が一番です。XmlSerializer を使用し、Packet および PacketList クラスのプロパティを適切な Xml*Attribute 属性で装飾して、出力のフォーマット方法を制御しますが、コレクション (p0、p1、p2 など) に対応する属性を記述する必要があるためです。 .) これは機能しません。

このような奇妙な形式を記述する必要があるため、現在の方法で手動で記述することは理にかなっています。

アンドリュー

于 2010-03-09T19:23:24.780 に答える