我正在尝试使用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
不要认为这是可能的:如果类型本身是未知的,我们将如何创建一个类型的实例? – Tigran
@意愿谢谢,我不知道之前存在!你应该写一个答案:) – Rachel