0

我正在使用序列化,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(这是正确的)但被反序列化为 Internal 因此丢失了我需要的数据。我可以修复它吗?

4

1 回答 1

2

您可以使用Json.Net

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

var json = JsonConvert.SerializeObject(obj, settings);
var newObj = JsonConvert.DeserializeObject<SomeType>(json, settings);
于 2013-08-23T10:54:23.793 回答