異常な接続プロトコルのためのXMLシリアル化
-
18-09-2019 - |
質問
私のアプリケーションでは、私はPacketList
クラスとPacket
クラスを持っています。私は、所望の出力のような何かを思い付くPacketList
にシリアライズヘルパーを使用できるようにしたいが、何の方向に行くようには考えていると思います。
私は、データを送信するための特有のプロトコルを持つサーバを模倣するプログラムを書いています。
クライアントは、形式でデータを送信しますCOMMAND|ARGUMENT_0|ARGUMENT_1|ARGUMENT_2|...|ARGUMENT_N\0
。 COMMAND
はMOVE
または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_POSITION
または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>
しかし、私はクリーンな方法でこれを実装したいと思います。
私のPacketList
は、基本的にPacket
sのリストが含まれ、そしてPacket
はString _Command
とString[] _Arguments
が含まれています。
それははるかに高く評価されるだろう。
解決
あなたは現在、それをやっている方法がベストです。など、私は属性が出力をフォーマットする方法を制御する属性*のXmlSerializerを使用して、適切なXMLを使用してパケットとPacketListクラスのプロパティを飾るためにと言うだろうが、あなたは、コレクション(P0、P1、P2に対応する属性を記述する必要があるため。)これは動作しません。
あなたは、このような奇妙なフォーマットを記述する必要があるので、、それは手動であなたが現在いる方法でそれを書くことは理にかなっています。
アンドリュー
他のヒント
I二アンドリューの答えます。
私の知る限り、あなたはデータ要素の二つのレベルを構成するので、あなたは、あなた自身のシリアライザを書く場合を除き、それを行うための方法はありません(要素の動的な数で!)の単一のXML要素にの属性として。よく、XmlSerializerをを必要とする、そこにそれをやっても意味がないのです、とのだけでリフレクションを使用して動作するために、いくつかのの感覚ます。