sql >> データベース >  >> NoSQL >> Redis

JSON文字列の逆シリアル化中の名前空間の変更の処理

    "$type"の形式 送信システムのCLR名前空間を含めるように公式にハードコーディングされています。したがって、次のいずれかを実行できます。

    1. 送信システムの名前と一致するようにCLR名前の名前を変更するか、

    2. 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をオーバーライドできます。 。




    1. MongoDB:同じドキュメントのデータを使用してドキュメントを更新する

    2. マングーススキーマのネストされたオブジェクト

    3. 2つのフィールドを比較する際のMongoDbクエリ条件

    4. MongoDB'$geoNearクエリのインデックスが見つかりません'