首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以二进制方式序列化WCF消息,而不是将其序列化为SOAP消息

以二进制方式序列化WCF消息,而不是将其序列化为SOAP消息
EN

Stack Overflow用户
提问于 2009-08-15 20:53:58
回答 3查看 29.1K关注 0票数 17

我有一个客户端-服务器应用程序,它使用WCF进行通信,并使用NetDataContractSerializer来序列化对象图。

由于大量数据在服务器和客户端之间传输,我尝试通过微调数据成员的大小来减小其大小(例如,将int更改为short,将long更改为int,等等)。

完成调优后,我发现传输的数据量并没有变化!

问题是,NetDataContractSerializer将对象图序列化为XML,所以无论数据成员的大小如何,唯一重要的是它的值的大小。例如,Int16数据成员的值10023将被序列化为字符串" 10023“(0x3130303233),而不仅仅是10023 (0x2727)。

我记得在远程处理中,我可以使用BinaryFormatter,它根据数据成员的类型序列化值,但我不知道是否可以将它与WCF一起使用。

有人有解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-16 11:12:51

WCF使用SOAP消息,但使用哪种消息编码完全取决于您。

基本上,开箱即用有两种编码方式:文本编码( XML消息的文本表示)或二进制编码。如果确实需要,您可以编写自己的消息编码。

开箱即用,basicHttp和wsHttp绑定使用文本编码-但如果您愿意,也可以对其进行更改。默认情况下,netTcp绑定(这是企业防火墙背后的首选)将使用二进制。

如果您愿意,您还可以定义(仅在config中)您自己的“二进制http”协议:

代码语言:javascript
复制
   <bindings>
      <customBinding>
        <binding name="BinaryHttpBinding">
          <binaryMessageEncoding />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>

然后在您的服务和客户端配置中使用它:

代码语言:javascript
复制
   <services>
      <service name="YourService">
        <endpoint
          address="http://localhost:8888/YourService/"
          binding="customBinding"
          bindingConfiguration="BinaryHttpBinding"
          contract="IYourService"
          name="YourService" />
      </service>
    </services>

现在您有了一个基于http的传输协议,它将以紧凑的二进制编码您的消息,供您使用和享受!

不需要额外的编码或繁琐的hack或大量的手动XML序列化代码-只需将它们连接在一起并使用即可!啊,WCF灵活性的乐趣!

票数 35
EN

Stack Overflow用户

发布于 2017-08-12 20:26:55

下面是一个如何在https://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study中进行自定义编码的示例

值得注意的是,实际发送的内容与使用默认编码发送byte[]的服务方法相同。无论您如何配置序列化,通过网络传输的消息仍然使用SOAP XML信封。

它看起来是这样的:

代码语言:javascript
复制
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>
票数 3
EN

Stack Overflow用户

发布于 2016-12-26 16:31:22

二进制编码器不会以二进制格式序列化您的对象,因为它根本与序列化无关!它是在较低层工作的东西,并决定如何在服务器和客户端之间传输消息。

换句话说,对象将首先被序列化(例如,通过DataContractSerializer ),然后被编码(通过BinaryEncoder)。因此,只要涉及到DataContractSerializer,您的对象就始终是XML格式。

如果您想要更紧凑的数据和更好的性能,请阅读此博客:

https://blogs.msdn.microsoft.com/dmetzgar/2011/03/29/protocol-buffers-and-wcf/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1282819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档