DataContractSerializer
을 사용하는 제네릭 형식을 포함하는 XML 파일에 클래스를 저장 /로드하려고합니다. 저장 작업이 있지만 deserializer의 knownTypes 목록이 없기 때문에로드 할 수 없다는 것을 알았습니다.형식을 참조하지 않고 제네릭을 deserialize 할 수 있습니까?
저장된 클래스를 직접 참조하지 않고도이 클래스를 직렬화 해제 할 수있는이 클래스를 serialize/deserialize 할 수 있습니까?
[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
인터페이스를 확장 :
다음
내가 /로드를 저장하려고 내
SessionVariables
클래스
그리고 SessionVariables
클래스의 단독 인스턴스
[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; }
}
은 다음과 같이 세션 변수에 액세스하는 데 사용됩니다
using (FileStream writer = new FileStream(@"C:\test.txt", FileMode.Create))
{
DataContractSerializer dcs = new DataContractSerializer(typeof(SessionVariables), singletonSessionVariables.GetKnownTypes());
dcs.WriteObject(writer, singletonSessionVariables);
writer.Close();
}
그러나이 방법은 내가이 유형 알려진 모르기 때문에 클래스를 직렬화하기 위해 작동하지 않습니다
singletonSessionVariables.Get<ModuleASessionVariables>().ModuleA_Property1
singletonSessionVariables.Get<ModuleBSessionVariables>().ModuleB_Property2
0 I는 다음과 같이 작업을 저장할 수 있어요.
사용 된 유형에 대한 직접적인 라이브러리 참조가 없을 때 제네릭 형식을 직렬화 및 비 직렬화 할 수 있습니까? 그렇다면 어떻게?
:/결과에 형식 정보가 포함 된 NetDataContractSerializer를 사용합니다. – Will
가능하지 않다고 생각합니다. 형식 자체가 알려지지 않은 경우 어떻게 형식의 인스턴스를 만들까요? – Tigran
@Will 감사합니다. 이전에는 존재하지 않았다. 이 질문에 대한 답변을 작성해야합니다 :) – Rachel