在序列化和反序列化之间存储序列化相关信息的最佳方法

时间:2013-08-23 10:48:15

标签: c# .net serialization datacontractserializer

我正在使用DataContractSerializer进行序列化,并且必须保存,例如具有Dictionary<string, IKnownTypesProvider>字段的对象,其中IKnownTypesProvider只知道它包含哪些类型。所以我可以轻松地使用它来序列化现有对象。但是如果我想稍后反序列化它,我必须将已知类型的列表传递给DataContractSerializer,但我不能这样做,因为我不知道在该对象被序列化时使用了哪些类型。来自MSDN的所有合成样本仅通过以相同方法序列化和反序列化对象来抑制该问题,因此具有相同的已知类型集。你能建议一种绕过它的方法吗?或者你可以建议另一种没有这种问题的序列化/反序列化机制?

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; }
    }
}

} 您可以看到字典中的第二个对象被序列化为DerivedInternal(这是正确的),但反序列化为内部因此丢失了我需要的数据。我能解决吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Json.Net

var settings = new JsonSerializerSettings() { 
                     TypeNameHandling = TypeNameHandling.All };

var json = JsonConvert.SerializeObject(obj, settings);
var newObj = JsonConvert.DeserializeObject<SomeType>(json, settings);