我有两个需要共享信息的独立程序。这种共享将由一个应用程序在数据库中放置XML serialized
对象完成,另一个应用程序在另一台机器上检索它。对象共享相同的variables
,但properties
和methods
不同。
我最终使用Newtonsoft.Json
库而不是xml
,并使用<JsonObject(MemberSerialization.OptIn)>
和JsonProperty()
属性来控制序列化的内容。
答案 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);
它独立于序列化字符串的对象方法。