在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:无法为属性String [Payload + SubPayloadOne + Name]设置类型的值[Payload + SubPayloadTwo + Name] String ---> System.ArgumentException:无法转换参数
我的理论是,在反序列化对象时,Mono不包含完整的命名空间。换句话说,它为Payload.SubPayloadOne.Name混淆Payload.SubPayloadTwo.Name,因为如果你不考虑它们的完整命名空间,两个对象都是“Name”。
通过上面的理论,我尝试通过将Payload.SubPayloadOne.Name或Payload.SubPayloadTwo.Name重命名为其他内容来解决此问题,例如,Payload.SubPayloadTwo.NameTwo。哪个确实奏效了。但是,这会破坏与现有产品的反向兼容性(因为现有的Payload对象已经在数据库中)。
如果可能的话,我正在寻找一种不涉及更改Web对象的解决方案。有什么想法吗?
谢谢!