Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化类型-值对C#_C#_Serialization - Fatal编程技术网

序列化类型-值对C#

序列化类型-值对C#,c#,serialization,C#,Serialization,我有一个类,它需要一个任意长度的类型-值对列表 例如,一个实例可能包含{(string,“hello”),(int,3)},另一个实例可能包含{(char,'a')}。该类型将永远只是一个primative类型,我可以限制为int和string,但我希望可以包括float、char等,以保持灵活性 我需要序列化和反序列化这个类的实例。我首选的序列化是使用System.XML.serialization.XmlSerializer的XML Tuple<Type, object> 我

我有一个类,它需要一个任意长度的类型-值对列表

例如,一个实例可能包含{(string,“hello”),(int,3)},另一个实例可能包含{(char,'a')}。该类型将永远只是一个primative类型,我可以限制为int和string,但我希望可以包括float、char等,以保持灵活性

我需要序列化和反序列化这个类的实例。我首选的序列化是使用System.XML.serialization.XmlSerializer的XML

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();
        }
    }
}