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+SubPayloadTwo+ Name] String ---> System.ArgumentException: パラメータの変換に失敗しました
私の理論では、オブジェクトを逆シリアル化するときに、Mono には完全な名前空間が含まれていません。つまり、完全な名前空間を考慮しない場合、両方のオブジェクトが「名前」であるため、Payload.SubPayloadOne.Name に対して Payload.SubPayloadTwo.Name を混同します。
上記の理論に従って、Payload.SubPayloadOne.Name または Payload.SubPayloadTwo.Name を別の名前 (Payload.SubPayloadTwo.NameTwo など) に変更して、この問題を解決しようとしました。これはうまくいきました。ただし、これにより、既存の製品との逆互換性が失われます (既存のペイロード オブジェクトが既にデータベースに存在するため)。
可能であれば、Web オブジェクトの変更を伴わない解決策を探しています。何かご意見は?
ありがとう!