3

私の RavenDB オブジェクトは、動的に読み込まれる DLL の型から作成されます。現在の の実行コンテキストに DLL をロードできないAppDomainため、JSON デシリアライザーは型を見つけることができません。

カスタム コンバーターを使用して、実行時に読み込まれたアセンブリで型を使用するにはどうすればよいですか?

NB AppDomain を介して別のドメインから DLL を提供しようとしましたが、後で競合が発生しました。その質問の問題は解決しましたが、すべてのオブジェクトが動的に読み込まれたアセンブリの型から作成されていることを確認する必要があります。

4

2 に答える 2

2

を指定しAssemblyて型を生成する場合は、次のようにしてカスタム コンバーターを作成します。私のカスタム型はすべて から派生していIEntityます。これを行う必要があるのは、カスタム クラスにいつフックするかをデシリアライザーが認識できるようにするためです。

public class DynamicAssemblyJsonConverter : JsonConverter
{
    private Assembly dynamicAssembly = null;

    public DynamicAssemblyJsonConverter(Assembly dynamicAssembly)
    {
        this.dynamicAssembly = dynamicAssembly;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jObject = JObject.Load(reader);

        var typeName = jObject["$type"].Value<string>().Split(',')[0];

        var target = dynamicAssembly.CreateInstance(typeName);

        serializer.Populate(jObject.CreateReader(), target);

        return target;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType is IEntity;
    }
}

(私のように) RavenDB を使用している場合は、これCustomConverterを作成し、それを Raven に適用してから、次のように割り当ててクエリまたはロードしますConventions.CustomizeJsonSerializer

于 2013-09-27T10:40:09.787 に答える
0

ロブの答えはうまくいきます。ただし、コンバーターで「$ref」を解決する必要がある場合は、次を追加する必要があります。

JToken reference = parser["$ref"];
if (reference != null)
{
    string id = reference.Value<string>();
    result = serializer.ReferenceResolver.ResolveReference(serializer, id);
}
于 2015-04-14T19:50:25.623 に答える