我有一个类需要一个任意长度的类型 - 值对列表。
例如,一个实例可能包含{(string," hello"),(int,3)},另一个实例可能包含{(char,' a')}。该类型只会是一个主要类型,我可以只限制int和string,但我宁愿可以包含float,char等,以保持灵活性。
我需要序列化和反序列化此类的实例。我首选的序列化是使用System.Xml.Serialization.XmlSerializer的XML。
Tuple<Type, object>
不好,因为默认情况下Tuple和对象都没有序列化,所以我定义了一个自定义结构:
[Serializable]
public struct ObjectDataItem { public Type Type; public string Value; }
并且我的类包含一个ObjectDataItems列表(字符串对于Value来说很好,因为我想某些类型的转换在某处是不可避免的。)
我的问题是我如何反序列化ObjectDataItem(特别是反序列化&#39; Type&#39;变量)?
我目前正在使用代码进行反序列化:
public static M LoadXML<M>(string fileName) where M : struct
{
if (File.Exists(fileName))
{
FileStream loadStream = new FileStream(fileName, FileMode.Open);
XmlSerializer serializer = new XmlSerializer(typeof(M));
M fileLoaded = (M)serializer.Deserialize(loadStream);
loadStream.Close();
return fileLoaded;
}
else throw new HException("File not found: {0}", fileName);
}
答案 0 :(得分:1)
您只能保存类型名称并在序列化后或在属性本身中将其还原
new ObjectDataItem { TypeName = typeof(int).FullName, Value = 3.ToString() }
...
public struct ObjectDataItem
{
public string TypeName;
public string Value;
[XmlIgnore]
public Type RealType
{
get
{
return Type.GetType(TypeName);
}
}
}
如果您要创建类型为Value
的{{1}}字段,则序列化程序会将该类型存储为XML并在反序列化中输入正确的类型
object
,您的<Value xsi:type="xsd:int">3</Value>
将会是
DataObjectItem