在 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 对象的解决方案。有什么想法吗?
谢谢!