【问题标题】:Best way to store serialization related info between serialization and deserialization在序列化和反序列化之间存储序列化相关信息的最佳方式
【发布时间】:2013-08-23 10:48:15
【问题描述】:

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

【问题讨论】:

    标签: c# .net serialization datacontractserializer


    【解决方案1】:

    你可以使用Json.Net

    var settings = new JsonSerializerSettings() { 
                         TypeNameHandling = TypeNameHandling.All };
    
    var json = JsonConvert.SerializeObject(obj, settings);
    var newObj = JsonConvert.DeserializeObject<SomeType>(json, settings);
    

    【讨论】:

    • @Demarsch 您在反序列化时没有使用settings(请参阅我的回答)。 var otherExternal = JsonConvert.DeserializeObject&lt;External&gt;(json, settings); :)
    • 抱歉,刚刚注意到:)谢谢!
    猜你喜欢
    • 2012-03-02
    • 2011-09-23
    • 2017-08-14
    • 2016-12-15
    • 2012-03-17
    • 2016-07-16
    相关资源
    最近更新 更多