序列化和反序列化来自不同位置的对象

时间:2014-05-21 15:50:23

标签: c# .net vb.net serialization

我有两个需要共享信息的独立程序。这种共享将由一个应用程序在数据库中放置XML serialized对象完成,另一个应用程序在另一台机器上检索它。对象共享相同的variables,但propertiesmethods不同。

  • 这两个课程的课程有多精确?
  • 是逐行匹配还是只是变量,属性和方法名称?

我最终使用Newtonsoft.Json库而不是xml,并使用<JsonObject(MemberSerialization.OptIn)>JsonProperty()属性来控制序列化的内容。

3 个答案:

答案 0 :(得分:3)

您没有指定您所使用的序列化类型。

标准的.NET二进制序列化器不适合在两个不同的程序集之间进行数据交换。当您进行反序列化时,您会收到与[Culture].[Assembly].[Version].SourceClass类似的错误,无法将其反序列化为[Culture].[Assembly].[Version].DestClass。即使类相同,也会发生这种情况。

有几种方法可以解决这个问题。 A)在两端使用相同的服务DLL来进行序列化B)通过使用覆盖来报告匹配的Culture-Assembly-Version-Class,然后看起来很狡猾或者C)使用XML序列化,但是这会欺骗它进行反序列化。非常罗嗦的输出,也是可读的。

对于二进制序列化,而不是NET二进制格式化程序,ProtoBuf-NET更快,产生更小的输出并使用几乎相同的语法。

How exact do the classes have to match between the two programs

ProtoBuf使用数字索引而不是属性名称,所以它们不应该太相似。当然必须有一些相似性,或者目的地可能不知道数据代表什么。类中的代码可能完全不同,因为它保持不变。

答案 1 :(得分:1)

序列化仅存储对象的数据 - 成员变量,属性等。只要数据类型兼容,它就应该有效。您不需要逐行匹配函数。

答案 2 :(得分:1)

这完全取决于您使用的序列化程序。有些需要完美匹配,有些则需要更松散地耦合到对象上。

  

这两个课程的课程有多精确?

嗯,一点也不。但它们应该在某种程度上相似,否则序列化没有意义。

  

匹配是逐行还是变量和方法名称?

如上所述:必须有一些重叠。通常,属性名称必须相同。但是,您当然也可以提供自定义映射。

看看Newtonsoft库,你可以像这样使用它(对于json):

JsonConvert.DeserializeObject<IEnumerable<Unit>>(result);

它独立于序列化字符串的对象方法。