与えられたクラス:
[DataContract]
public sealed class ChangedField
{
[DataMember(Name="I")] public ushort FieldId { get; set; }
[DataMember(Name="V")] public object Value { get; set; }
}
WireShark は、WCF TCP バインディングを介して送信された場合、メッセージのエンコードがバイナリであることを示しています (印刷可能な文字のみですが、アイデアは得られます)。
ChangedFielda.I..a.V....e:double..e http://www.w3.org/2001/XMLSchema.s.....a.
しかし、このタイプのインスタンスを次のようにシリアル化すると...
var ser = new DataContractSerializer(typeof(ChangedField));
var stream = new MemoryStream();
ser.WriteObject(stream, new ChangedField { FieldId = 1, Value = 1.23d });
...その後、ストリームには次のような SOAP XML が含まれます。
<ChangedField>
<I>1</I>
<V i:type="a:double" xmlns:a="http://www.w3.org/2001/XMLSchema">1.23</V>
</ChangedField>
私の質問は、自分のコードでこのバイナリ表現を生成するように制御するにはどうすればよいですか?DataContractSerializer
余談として:
ご覧のとおり、object
プロパティの型をエンコードする必要があるため (つまり URI)、メッセージが肥大化しています。これを変更して、カスタム バイナリ エンコーディングを使用します。私のシナリオでは、フィールド ID によって型が決まります (この場合はdouble
)。