0

私はシリアライゼーションを使用しており、たとえば、どのタイプから構成されているかを知っDataContractSerializerているフィールドを持つオブジェクトを保存する必要があります。したがって、既存のオブジェクトをシリアル化するために簡単に使用できます。しかし、後で逆シリアル化したい場合は、既知の型のリストを渡す必要がありますが、そのオブジェクトがシリアル化されたときにどの型が使用されたかがわからないため、それを行うことはできません。MSDN のすべての合成サンプルは、同じメソッドでオブジェクトをシリアル化および逆シリアル化し、既知の型の同じセットを持つだけで、この問題を抑制します。それをバイパスする方法を提案できますか?または、そのような問題がないシリアライゼーション/デシリアライゼーションの別のメカニズムを提案できますか?Dictionary<string, IKnownTypesProvider>IKnownTypesProviderDataContractSerializer

UPD: @I4V は Json.NET の使用を提案しました。ただし、これが失敗する私の例です。私の最初のコードを忘れてください。サンプルは次のとおりです。

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace TestConsoleProject
{
    internal class Program
    {
    private static void Main(string[] args)
    {
        var external = new External();
        external.Dictionary.Add(100, new Internal() {InternalCount = 100});
        external.Dictionary.Add(200, new DerivedInternal() {InternalCount = 200, DerivedInternalCount = 200});
        var settings = new JsonSerializerSettings() {TypeNameHandling = TypeNameHandling.All};
        var json = JsonConvert.SerializeObject(external, settings);
        Console.WriteLine(json);
        var otherExternal = JsonConvert.DeserializeObject<External>(json);
        Console.WriteLine(otherExternal.Dictionary[200].GetType());
        Console.ReadLine();
    }

    private class External
    {
        public Dictionary<int, Internal> Dictionary { get; set; }

        public External()
        {
            Dictionary = new Dictionary<int, Internal>();
        }
    }

    private class Internal
    {
        public int InternalCount { get; set; }
    }

    private class DerivedInternal : Internal
    {
        public int DerivedInternalCount { get; set; }
    }
}

ディクショナリの 2 番目のオブジェクトはDerivedInternal(これは正しい) としてシリアル化されていますが、Internal として逆シリアル化されているため、必要なデータが失われていることがわかります。どうにか直せますか?

4

1 に答える 1