【发布时间】: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