序列化类型 - 值对C#

时间:2017-09-04 18:13:23

标签: c# serialization

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

例如,一个实例可能包含{(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);
    }

1 个答案:

答案 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