序列化类型-值对C#
我有一个类,它需要一个任意长度的类型-值对列表 例如,一个实例可能包含{(string,“hello”),(int,3)},另一个实例可能包含{(char,'a')}。该类型将永远只是一个primative类型,我可以限制为int和string,但我希望可以包括float、char等,以保持灵活性 我需要序列化和反序列化这个类的实例。我首选的序列化是使用System.XML.serialization.XmlSerializer的XML序列化类型-值对C#,c#,serialization,C#,Serialization,我有一个类,它需要一个任意长度的类型-值对列表 例如,一个实例可能包含{(string,“hello”),(int,3)},另一个实例可能包含{(char,'a')}。该类型将永远只是一个primative类型,我可以限制为int和string,但我希望可以包括float、char等,以保持灵活性 我需要序列化和反序列化这个类的实例。我首选的序列化是使用System.XML.serialization.XmlSerializer的XML Tuple<Type, object> 我
Tuple<Type, object>
我的类包含一个ObjectDataItems列表(字符串对于值来说很好,因为我猜某种类型转换无论如何都是不可避免的)
我的问题是如何反序列化ObjectDataItem(特别是反序列化'Type'变量)
我目前正在使用以下代码进行反序列化:
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);
}
public static M LoadXML(字符串文件名),其中M:struct
{
if(File.Exists(fileName))
{
FileStream loadStream=newfilestream(文件名,FileMode.Open);
XmlSerializer serializer=新的XmlSerializer(typeof(M));
M fileLoaded=(M)序列化程序。反序列化(loadStream);
loadStream.Close();
返回已加载的文件;
}
else抛出新的HException(“未找到文件:{0}”,文件名);
}
您只能保存类型名称,并在序列化后或在属性本身中恢复它
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);
}
}
}
如果将值
字段设置为对象
类型,序列化程序将以XML形式存储该类型,并将正确的类型放入反序列化中
3
您的DataObjectItem
将如下所示
public struct ObjectDataItem
{
public object Value;
[XmlIgnore]
public Type Type
{
get
{
return Value.GetType();
}
}
}
看起来像是复制的哦,基本上你是说如果我给它一个机会序列化对象而不假设它不会工作,C#会自动处理这个问题。今晚我会尝试一下,如果可行的话,我会把它标记为解决方案。通用解决方案在这里也适用吗?e、 g.ObjectDataItem{public T Value;},其中在序列化过程中,值被转换为对象(意味着类型信息被保存为字符串),在反序列化过程中,我将字符串转换回类型,并使用它来提供泛型类型参数并将对象强制转换到它?这将是一个很难实现不同类型泛型集合的问题。谢谢。我使用了object和XmlIgnore类型变体。
public struct ObjectDataItem
{
public object Value;
[XmlIgnore]
public Type Type
{
get
{
return Value.GetType();
}
}
}