任何人都知道为什么C#中的数据协定序列化程序生成的以下XML在Windows中运行良好但在Mono上的Linux下运行不正常?
XML:
<Message i:type="UserMessage" xmlns="http://schemas.datacontract.org/2004/07/NetTunnel"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><type>UserMessage</type>
<nick>Unnamed</nick><services><Service><enabled>true</enabled><port_ranges i:nil="true"/>
<service_name>vent</service_name></Service></services><state>Created</state>
<userid>1</userid></Message>
错误:
Unhandled Exception: System.Runtime.Serialization.SerializationException: Deserializing
type 'System.Object'. Expecting state 'EndElement'. Encountered state 'Element' with
name 'enabled' with namespace 'http://schemas.datacontract.org/2004/07/NetTunnel'.
如果没有列出任何服务(xml标记<services/>
),它也会给我一个错误。 services变量的类型为List<Service>
。这只是Mono无法处理的一种吗?另一种类型会更合适吗?或者它完全是另一回事?
答案 0 :(得分:2)
不是你想要的答案,但是:Mono中与.Net不同的每一个行为都是我在Mono中知道的 bug 。请(!)file it,特别是如果它真的那么小,很容易重现。在这里讨论可能会有所帮助,但下一个人可能遇到同样的问题,需要研究问题等。
只需file it,单声道的人很棒,会更有帮助。为了帮助他人进行搜索:我建议您使用指向该问题的链接更新您的帖子。
关于你的上一个问题:你不应该只是因为Mono可能需要反序列化它而改变类型 - 而List就可以了。
答案 1 :(得分:1)
从评论中,您不需要WCF,只想共享数据。在这种情况下,我会看protobuf-net。我很偏颇(因为我是作者),但它是免费的(有源),所以我不建议自我获取。只是;它是一种快速,便携的序列化API,模仿谷歌的“协议缓冲”数据格式。处理速度非常快(例如,通常比xml快得多),并且在线上非常小。
如果您已经在使用数据合同,则可以通过添加唯一的Order
值(它将其用作数字标识符)来调整它们:
[DataContract]
public class Foo {
[DataMember(Order = 1)]
public int Id {get;set;}
[DataMember(Order = 2)]
public string Name {get;set;}
}
(或者您可以使用特定的protobuf-net属性)
完整的源代码可用,它适用于Mono,常规.NET,CF等。
答案 2 :(得分:0)
在此提交错误报告:https://bugzilla.novell.com/show_bug.cgi?id=581611
在修复之前,了解任何替代方案会很棒。