"$type"
の形式 送信システムのCLR名前空間を含めるように公式にハードコーディングされています。したがって、次のいずれかを実行できます。
-
送信システムの名前と一致するようにCLR名前の名前を変更するか、
-
DefaultSerializationBinder
をサブクラス化します これを使用して、JsonSerializerSettings.Binder
で設定することにより、逆シリアル化中にCLR名前空間名の名前を変更します。 。
以下は、これを行うための最初のカットです:
public class NamespaceMappingSerializationBinder : DefaultSerializationBinder
{
public string FromNamespace { get; set; }
public string ToNamespace { get; set; }
public override Type BindToType(string assemblyName, string typeName)
{
string fixedTypeName;
if (FromNamespace != null && ToNamespace != null)
{
fixedTypeName = typeName.Replace(FromNamespace, ToNamespace);
}
else
{
fixedTypeName = typeName;
}
var type = base.BindToType(assemblyName, fixedTypeName);
return type;
}
}
次に、JSONを逆シリアル化するときに、Binder
を設定します JsonSerializerSettings
で そのように:
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Binder = new NamespaceMappingSerializationBinder { FromNamespace = "From Namespace", ToNamespace = "Your Namespace" } };
上記の型名の解析は非常に粗雑です。私はここではるかに賢いパーサーを見つけました:C#の一般的な型名を解析する方法は?カスタムのBinder
を拡張する必要がある場合もあります マッピングの辞書を作成します。
同様に、シリアル化時に名前空間名を再マップする必要があり、.Net 4.0以降で作業している場合は、BindToName
をオーバーライドできます。 。