1

在 Windows 上,使用 .NET。序列化或反序列化以下 WCF Web 对象没有问题:

[DataContract]
public class Payload
{
    public Payload() {}

    public class SubPayloadOne
    {
        public String Name { get; set; }
        public int Count { get; set; }
    }

    public class SubPayloadTwo
    {
        public String Name { get; set; }
        public int Number { get; set; }
    }

    [DataMember]
    public SubPayloadOne P1 { get; set; }
    [DataMember]
    public SubPayloadTwo P2 { get; set; }
}

在 Mono(在 Ubuntu 上)上,尝试反序列化上述示例中的 Web 对象将导致以下错误: System.InvalidOperationException: Failed to set value of type String[Payload+SubPayloadOne+Name] for property String[Payload+SubPayloadTwo+ Name] String ---> System.ArgumentException: 转换参数失败

我的理论是 Mono 在反序列化对象时不包括完整的命名空间。换句话说,Payload.SubPayloadTwo.Name 与 Payload.SubPayloadOne.Name 混淆了,因为如果不考虑它们的完整命名空间,这两个对象都是“名称”。

按照上述理论,我尝试通过将 Payload.SubPayloadOne.Name 或 Payload.SubPayloadTwo.Name 重命名为其他名称来解决此问题,例如 Payload.SubPayloadTwo.NameTwo。哪个起作用了。但是,这会破坏与现有产品的反向兼容性(因为现有的 Payload 对象已经在数据库中)。

如果可能的话,我正在寻找一种不涉及更改 Web 对象的解决方案。有什么想法吗?

谢谢!

4

0 回答 0