C# 问题:序列化和反序列化,其意义和使用时间

C# 问题:序列化和反序列化,其意义和使用时间,c#,.net,web-services,serialization,C#,.net,Web Services,Serialization,我正在读一本关于序列化和反序列化文件或通过web服务发送数据的书。我的问题是。。使用web服务时必须使用序列化。另外,当使用序列化在本地保存文件时,这样做的意义是什么 我知道它将数据保存为二进制数据。这是压缩数据吗 我感谢各位的答复。谢谢 二进制数据比SOAP序列化更紧凑,但SOAP序列化针对web使用而不是本地存储进行了优化。关于web服务,大多数web服务都希望它们的数据以非常特定的格式到达,但通常,.NET和Visual Studio可以为您解决这一问题。如果您手动尝试为Web服务创建SO

我正在读一本关于序列化和反序列化文件或通过web服务发送数据的书。我的问题是。。使用web服务时必须使用序列化。另外,当使用序列化在本地保存文件时,这样做的意义是什么

我知道它将数据保存为二进制数据。这是压缩数据吗


我感谢各位的答复。谢谢

二进制数据比SOAP序列化更紧凑,但SOAP序列化针对web使用而不是本地存储进行了优化。关于web服务,大多数web服务都希望它们的数据以非常特定的格式到达,但通常,.NET和Visual Studio可以为您解决这一问题。如果您手动尝试为Web服务创建SOAP,则可能是做错了什么。您应该能够添加对web服务的引用,并让visualstudio生成一个好的对象模型,您可以使用它来抽象所有SOAP和序列化问题

使用web服务时必须使用序列化


是的。网络传输字节,而不是对象,因此必须将对象转换为字节(无论是原始二进制格式、XML、SOAP、JSON还是其他格式)。保存到磁盘上的文件也是如此:磁盘可以包含字节,而不是对象…

这里有几个问题

首先,在使用web服务时是否必须使用序列化:我想说是的。序列化某物通常(总是?)是指从内存中提取某个对象并将其转换为另一种格式;例如,从内存到磁盘驱动器上的文件。有了这个(蹩脚的)定义,web服务将至少在内部根据请求序列化一些对象(以确定调用什么方法,等等)。如果您的网站有任何参数或返回值,也必须序列化这些参数或返回值


其次,序列化为二进制格式通常是为了大小和速度。将对象(在.Net中)序列化为二进制对象通常要快得多,而且比xml表示形式小得多;要将数据发送到进程外(尤其是通过网络),您需要对其进行序列化。大多数情况下,这在.NET中是隐含的-您只需告诉它如何操作即可。有了“asmx”,它将使用
XmlSerializer
,因此不需要太多(除了公共的
.ctor()
)。对于WCF,最好使用显式的
[DataContract]
等。请注意,在这两种情况下,它都使用基于xml的变体;“二进制”的描述很简单:计算机中的所有事物都是二进制的(或者更糟的是:电子、场等等)。文本的表现就在我们的想象中-p

如果您使用“remoting”,那么默认情况下它使用
BinaryFormatter
,这是一个真正的二进制格式化程序(正如它所建议的那样),但它有自己的一些小问题

我将在使用数据进行传输(通信等)和存储之间画出一个很大的区别。在第一种情况下,它是短暂的,如果您绝对必须(尽管我尽量不这么做),您可以滥用更多的SOA技术,例如,
BinaryFormatter
NetDataContractSerializer
包含类型元数据,这是可以接受的,但是,如果你把它储存在短期以外的任何东西上,它都可能是一种痛苦。存储后,您需要非常小心才能重新创建它,而基于元数据/字段的存储是非常重要的

对于存储,我坚持使用基于合同的数据:

  • xml(通过
    XmlSerializer
    DataContractSerializer
  • json
  • 二进制(可能是protobuf-net)
(在最下面的例子中,二进制表示:根本不基于文本)