通过网络序列化对象

时间:2015-02-20 14:31:33

标签: c# json web-services serialization serializable

我阅读了有关通过网络发送序列化对象的好处的文章。性能和尺寸成本。

有些人解释了DataContract并使用了JSON或XML序列化。

但我无法找到有关如果我不使用这些属性会发生什么的文章,并且假设我的对象的属性和状态是原始类型,我会返回一个对象。显然,当我使用像DataContractJsonSerializer这样的串行器及其WriteObject方法时,它会引发异常。

如果我在Web服务方法中返回会发生什么,这是一个具有属性' Serializable'的Employee类型的对象。我的意思是.net会对待这个结果。

[WebMethod]
public Employee SendEmployeeData()
{
}

该对象将通过网络作为二进制流或什么来发送?

是否需要序列化对象以通过网络发送它?

我还读到DataContractSerializer会解释Serializable属性。

difference between DataContract attribute and Serializable attribute in .net

2 个答案:

答案 0 :(得分:2)

  

我的意思是.net会对待这个结果。

这完全取决于您正在使用的框架/框架。 WCF对ASMX的工作方式不同,ASMX的工作方式与MVC不同,后者会......等等等等。

  

该对象将通过网络作为二进制流发送还是什么?

是; TCP流是流

  

是否需要序列化对象以通过网络发送它?

是;你只能通过数据发送一系列字节;将对象转换为一系列字节的过程称为序列化。

  

我还读到DataContractSerializer会解释Serializable属性。

嗯......有点......但这并不是很好用,并且类似于使用BinaryFormatter(它可能会使用NetDataContractSerializer,但这大部分都是相同的问题) - 基本上:不要那样做。如果您使用的是旨在交换数据合同的API,使用数据合同。没有最好的"接近这里;这一切都取决于你想要做什么以及你的优先事项。与BinaryFormatter等相比,JSON和XML具有互操作性优势,但还有其他选择具有相同的优势。

答案 1 :(得分:2)

如果我没记错的话,DataContractSerializer非常明确地要求对所有需要序列化的属性和对象进行属性注释。不过我可能错了:自从我使用它以来已经有一段时间了。

他们绝对不会使用BinaryFormatter自动序列化。 Serializable属性只是告诉 BinaryFormatter序列化对象的标记。

Json.NET(我在评论中引用)将使用反射来构建给定对象的序列化结构 - 甚至是dynamic个。以下代码将使用JSON.net构建一个动态对象并将其转换为JSON字符串:

//build request
var dynamicObject = new {
    message = "Hello World",
    number = 32,
    date = DateTime.Now
};

//convert to JSON string
string json = JsonConvert.SerializeObject(dynamicObject);
Console.WriteLine(json);