单声道反序列化的麻烦

时间:2010-02-20 23:00:44

标签: c# mono datacontractserializer

任何人都知道为什么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无法处理的一种吗?另一种类型会更合适吗?或者它完全是另一回事?

3 个答案:

答案 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

在修复之前,了解任何替代方案会很棒。