【问题标题】:Serialization of objects through network通过网络对对象进行序列化
【发布时间】:2015-04-22 06:33:20
【问题描述】:

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

一些关于 DataContract 和使用 JSON 或 XML 序列化的解释。

但是我找不到关于如果我不使用这些属性会发生什么的文章,并且假设我的对象的属性和状态是原始类型,我返回一个对象。显然,当我具体使用 DataContractJsonSerializer 之类的序列化程序及其 WriteObject 方法时,它会抛出异常。

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

[WebMethod]
public Employee SendEmployeeData()
{
}

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

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

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

difference between DataContract attribute and Serializable attribute in .net

【问题讨论】:

  • 快速说明:使用 Json.NET,而不是 DataContractSerializer。性能无疑更好,属性标注更干净IMO。甚至微软也在 WebAPI 2 中使用 Json.NET。
  • 感谢您的方法。这不是我第一次听说,我开始阅读和探索它。

标签: c# json web-services serialization serializable


【解决方案1】:

我的意思是 .net 会如何处理这个结果。

这将完全针对您正在使用的框架/框架。 WCF 与 ASMX 的工作方式不同,这与 MVC 的工作方式不同,这将......等等等等。

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

是的; TCP流就是流

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

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

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

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

【讨论】:

  • 感谢您的回答。根据您的 TCP 流短语。 .Net 是否要求我的对象具有 Serializable 属性?
  • @MaximusDecimus 几乎唯一关心[Serializable] 的是BinaryFormatter,无论如何你都不应该使用它;使用BinaryFormatter 你不知道的主要是remoting,无论如何你都不应该使用它。所以如果你不使用需要[Serializable]的东西,不,你不需要添加[Serializable]
  • 我将添加到@MarcGravell 的评论中,我认为最好对 TCP 流(和其他传输机制)进行更多研究,并提出与该主题特别相关的另一个问题。
【解决方案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);

【讨论】:

  • 如果你根本不注释,IIRC它会退回到类似于BinaryFormatter的行为 - 这是推荐
  • @MarcGravell - 是的,感谢您澄清这一点。正如您在回答中所说,明确定义的合同绝对是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2014-12-16
  • 2013-11-21
相关资源
最近更新 更多