我有一个客户端-服务器应用程序,它使用WCF进行通信,并使用NetDataContractSerializer来序列化对象图。
由于大量数据在服务器和客户端之间传输,我尝试通过微调数据成员的大小来减小其大小(例如,将int更改为short,将long更改为int,等等)。
完成调优后,我发现传输的数据量并没有变化!
问题是,NetDataContractSerializer将对象图序列化为XML,所以无论数据成员的大小如何,唯一重要的是它的值的大小。例如,Int16数据成员的值10023将被序列化为字符串" 10023“(0x3130303233),而不仅仅是10023 (0x2727)。
我记得在远程处理中,我可以使用BinaryFormatter,它根据数据成员的类型序列化值,但我不知道是否可以将它与WCF一起使用。
有人有解决方案吗?
发布于 2009-08-16 11:12:51
WCF使用SOAP消息,但使用哪种消息编码完全取决于您。
基本上,开箱即用有两种编码方式:文本编码( XML消息的文本表示)或二进制编码。如果确实需要,您可以编写自己的消息编码。
开箱即用,basicHttp和wsHttp绑定使用文本编码-但如果您愿意,也可以对其进行更改。默认情况下,netTcp绑定(这是企业防火墙背后的首选)将使用二进制。
如果您愿意,您还可以定义(仅在config中)您自己的“二进制http”协议:
<bindings>
<customBinding>
<binding name="BinaryHttpBinding">
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
然后在您的服务和客户端配置中使用它:
<services>
<service name="YourService">
<endpoint
address="http://localhost:8888/YourService/"
binding="customBinding"
bindingConfiguration="BinaryHttpBinding"
contract="IYourService"
name="YourService" />
</service>
</services>
现在您有了一个基于http的传输协议,它将以紧凑的二进制编码您的消息,供您使用和享受!
不需要额外的编码或繁琐的hack或大量的手动XML序列化代码-只需将它们连接在一起并使用即可!啊,WCF灵活性的乐趣!
发布于 2017-08-12 20:26:55
下面是一个如何在https://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study中进行自定义编码的示例
值得注意的是,实际发送的内容与使用默认编码发送byte[]的服务方法相同。无论您如何配置序列化,通过网络传输的消息仍然使用SOAP XML信封。
它看起来是这样的:
POST http://127.0.0.1:12345/forSwerGup182948/Client HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo+WkoDpet/JOtGlW+EHdpDQAAAAAvFs5XOJ0tEW0wTvNVRDUIiabR6u+p+JNnd5Z+SWl1NcACQAA
SOAPAction: "http://tempuri.org/ITransmissionService/SendData"
Host: 127.0.0.1:12345
Expect: 100-continue
Accept-Encoding: gzip, deflate
Content-Length: 2890
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendData xmlns="http://tempuri.org/"><message>eyI8Q2FsbGJhY2tJZD5rX19CYWNraW5nRmllbGQiOiJlYTQ3ZWIzMS1iYjIzLTRkODItODljNS1hNTZmNjdiYmQ4MTQiLCI8RnJvbT5rX19CYWNraW5nRmllbGQiOnsiPENoYW5uZWxOYW1lPmtfX0JhY2tpbmdGaWVsZCI6Ikdyb3VwMSIsIjxOYW1lPmtfX0==</message></SendData></s:Body></s:Envelope>
发布于 2016-12-26 16:31:22
二进制编码器不会以二进制格式序列化您的对象,因为它根本与序列化无关!它是在较低层工作的东西,并决定如何在服务器和客户端之间传输消息。
换句话说,对象将首先被序列化(例如,通过DataContractSerializer ),然后被编码(通过BinaryEncoder)。因此,只要涉及到DataContractSerializer,您的对象就始终是XML格式。
如果您想要更紧凑的数据和更好的性能,请阅读此博客:
https://blogs.msdn.microsoft.com/dmetzgar/2011/03/29/protocol-buffers-and-wcf/
https://stackoverflow.com/questions/1282819
复制相似问题