【发布时间】:2013-11-27 14:34:23
【问题描述】:
我正在尝试使用DataContractSerializer 将类保存/加载到包含泛型类型的 xml 文件中。我有保存工作,但我意识到我无法加载它,因为我没有反序列化器的 knownTypes 列表。
有没有一种方法可以对此类进行序列化/反序列化,这样我就可以在不直接引用任何存储类型的情况下对其进行反序列化?
这是我正在尝试保存/加载的 SessionVariables 类:
[DataContract]
public class SessionVariables
{
[DataMember]
private Dictionary<Type, ISessionVariables> _sessionVariables = new Dictionary<Type, ISessionVariables>();
private object _syncLock = new object();
public T Get<T>()
where T : ISessionVariables, new()
{
lock (_syncLock)
{
ISessionVariables vars = null;
if (_sessionVariables.TryGetValue(typeof(T), out vars))
return (T)vars;
vars = new T();
_sessionVariables.Add(typeof(T), vars);
return (T)vars;
}
}
public IList<Type> GetKnownTypes()
{
IList<Type> knownTypes = new List<Type>();
knownTypes.Add(this.GetType().GetType()); // adds System.RuntimeType
foreach (Type t in _sessionVariables.Keys)
{
if (!knownTypes.Contains(t))
knownTypes.Add(t);
}
return knownTypes;
}
}
应用程序的不同模块扩展ISessionVariables 接口以创建自己的会话变量集,如下所示:
[DataContract]
public class ModuleASessionVariables : ISessionVariables
{
[DataMember]
public string ModuleA_Property1{ get; set; }
[DataMember]
public string ModuleA_Property2 { get; set; }
}
[DataContract]
public class ModuleBSessionVariables : ISessionVariables
{
[DataMember]
public string ModuleB_Property1{ get; set; }
[DataMember]
public string ModuleB_Property2 { get; set; }
}
SessionVariables 类的单例实例用于访问会话变量,如下所示:
singletonSessionVariables.Get<ModuleASessionVariables>().ModuleA_Property1
singletonSessionVariables.Get<ModuleBSessionVariables>().ModuleB_Property2
我的存档是这样的:
using (FileStream writer = new FileStream(@"C:\test.txt", FileMode.Create))
{
DataContractSerializer dcs = new DataContractSerializer(typeof(SessionVariables), singletonSessionVariables.GetKnownTypes());
dcs.WriteObject(writer, singletonSessionVariables);
writer.Close();
}
但是,此方法无法反序列化该类,因为我不知道它是已知类型。
当我没有对所使用的任何类型的直接库引用时,我可以序列化和反序列化泛型类型吗?如果有,怎么做?
【问题讨论】:
-
:/ 我会使用 NetDataContractSerializer,它在结果中包含类型信息。
-
不要认为这是可能的:如果类型本身是未知的,我们将如何创建一个类型的实例?
-
@Will 谢谢,我以前不知道它存在!你应该为此写一个答案:)
-
@Rachel:成功了吗?
-
@会不会是这样想的,我成功的将
SessionVariables对象和子对象序列化和反序列化到一个文件中,无需提前指定类型,类型和数据就成功出来了。我遇到的唯一小问题是 _syncObject 在反序列化时被初始化为 null。我仍然需要测试将子对象移动到单独的程序集,并确保它可以在没有引用的情况下反序列化。
标签: c# .net-3.5 datacontractserializer