gpt4 book ai didi

WCF - 以编程方式测量近似消息大小

转载 作者:行者123 更新时间:2023-12-04 16:01:22 25 4
gpt4 key购买 nike

给定一个类:

[DataContract]
public sealed class ChangedField
{
[DataMember(Name="I")] public ushort FieldId { get; set; }
[DataMember(Name="V")] public object Value { get; set; }
}

WireShark 显示,当通过 WCF TCP 绑定(bind)发送时,消息的编码是二进制的(仅限可打印字符,但你明白了):

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 )。

最佳答案

默认情况下,TCP 绑定(bind)使用二进制消息编码器,而在第二个示例中,您只是将数据协定序列化为 XML。二进制消息编码器发生的情况是,它基本上为数据协定序列化程序提供了一个自定义 XmlWriter 实现,该实现生成专有的二进制格式,而不是 XML。

如果您想将此与不同的绑定(bind)(例如 HTTP)一起使用,则需要创建自定义绑定(bind)并添加 BinaryMessageEncodingElement元素而不是普通的 TextMessageEncodingElement。

关于WCF - 以编程方式测量近似消息大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com