3

任何人都知道为什么 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 无法处理的类型吗?其他类型会更合适吗?还是完全是别的东西?

4

3 回答 3

2

不是您想要的答案,而是: Mono 上与 .Net 不同的每一个行为都是我所知道的 Mono 中的一个错误。请(!)归档它,特别是如果它真的那么小且易于复制。在这里讨论它可能会有所帮助,但下一个人可能会遇到同样的问题,需要研究问题等。

只需归档它,Mono 的人很棒,而且会更有帮助。为了帮助其他人进行搜索:我建议您使用该问题的链接更新您的帖子。

关于您的最后一个问题:您不应该仅仅因为 Mono 可能需要反序列化它而更改类型 - List 就可以了。

于 2010-02-20T23:06:50.180 回答
1

从评论中,您不需要 WCF,只想共享数据。在这种情况下,我会查看protobuf-net。我很有偏见(因为我是作者),但它是免费的(有源代码),所以我不推荐它以获取自我利益。简单地; 它是一个快速、可移植的序列化 API,以 google 的“protocol buffers”数据格式为蓝本。处理速度非常快(例如,通常比 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 等。

于 2010-02-21T19:52:18.937 回答
0

在此处提交错误报告:https ://bugzilla.novell.com/show_bug.cgi?id=581611

不过,在解决此问题之前知道任何替代方案会很高兴。

于 2010-02-21T02:08:45.147 回答