2010-02-20 64 views
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/>)服务。服务变量的类型为List<Service>。这只是Mono无法处理的类型吗?另一种类型会更合适吗?还是完全是另一回事?

+0

出于好奇 - 是你的目标是使用WCF?或者只是分享数据?如果后者我可以推荐一些跨平台的替代串行器(开源,每个平台上都有相同的源代码)。 – 2010-02-20 23:20:42

+0

不需要使用WCF,只需要共享数据。我很想听听其他序列化程序。希望他们能够很容易地使用注释? – Nayruden 2010-02-20 23:55:47

回答

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属性)

完整的源代码可用,它适用于单声道,定期.NET,CF等

2

不是你想要的答案,但是:单声道上的每一个与.Net不同的行为都是我知道的单声道中的错误。请(!)file it,特别是如果它真的很小,很容易重现。在这里讨论它可能帮助一样快,但下一个家伙可能会遇到同样的问题,需要研究的问题等。

只是file it,单声道家伙真棒,会更有帮助。为了帮助他人进行搜索:我建议您更新您的帖子并附上问题链接。

关于你的最后一个问题:你不应该因为Mono可能需要反序列化它而改变这个类型 - 而List就好。

+0

会这样做,谢谢你的链接。 – Nayruden 2010-02-20 23:56:34