Json.NET を使用する C# サーバーと、Jackson を使用する Java/Android アプリがあります。
ProtocolContainer というオブジェクトをシリアライズおよびデシリアライズします。そのオブジェクトには、「SubPacket」というプロパティが 1 つ含まれています。
public class ProtocolContainer
{
public DataPacket SubPacket { get; set; }
// ...
}
「DataPacket」を継承する多くのクラスがあるため、どこからでも JSON 文字列を受け取ると、SubPacket を正しいサブクラスにデシリアライズできる必要があります。
これは、Json.NET に切り替える前 (DataContractJsonSerializer を使用していたとき) は正常に機能していましたが、切り替え後は、Android デバイスからのデータを実際に逆シリアル化できませんでした。
JAVAから「修飾された型名」を送信していないという事実に関係していると思われますが、それもしたくありません。名前を送信しても問題ありません。たとえば、次のようになります。
"$type":"my.namespace.classname"
しかし、「修飾された型名」である.NET関連の肥大化した混乱をすべて送信するのは問題ありません。
現在、JsonSerializationException が発生しています。これは、JSON の簡略化されたバージョンです。
{
"SubPacket":{
"$type":"my.namespace.myClass",
"HardwareId":"a5af9321038c38dc"
},
}
クラスが .NET 側に存在する場合でも、次のエラーで逆シリアル化に失敗します。
{Newtonsoft.Json.JsonSerializationException: JSON 'my.namespace.myClass' で指定された型が解決されませんでした。パス 'SubPacket.$type'、1 行目、位置 138. で ...
前述のように、アセンブリ文字列全体を書き出すことはしたくありません。これは、JAVA アプリにハードコードするのが長くて奇妙です。
ヒントとポインタをありがとう=)