【问题标题】:Serialising Type-Value pairs C#序列化类型-值对 C#
【发布时间】:2017-09-04 18:13:23
【问题描述】:

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

例如,一个实例可能包含 { (string, "hello"), (int, 3) },而另一个实例可能包含 { (char, 'a') }。该类型只能是原始类型,我可以仅限于 int 和 string,但我希望可以包含 float、char 等以保持灵活性。

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

Tuple<Type, object> 

不好,因为默认情况下元组和对象都没有序列化,所以我定义了一个自定义结构:

[Serializable]
public struct ObjectDataItem { public Type Type; public string Value; }

我的班级拥有一个 ObjectDataItems 列表(字符串对于 Value 来说很好,因为我猜无论如何某些类型转换是不可避免的)。

我的问题是如何反序列化 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);
    }

【问题讨论】:

标签: c# serialization


【解决方案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 字段设为object 类型,则序列化程序会将类型存储在XML 中并将正确的类型放入反序列化中

&lt;Value xsi:type="xsd:int"&gt;3&lt;/Value&gt;

你的DataObjectItem 看起来像

public struct ObjectDataItem
{
    public object Value;

    [XmlIgnore]
    public Type Type
    {
        get
        {
            return Value.GetType();
        }
    }
}

【讨论】:

  • 哦,基本上你是说如果我给它一个序列化对象的机会而不假设它不起作用,C# 会自动处理这个问题。今晚我会试试,如果可行,我会将此标记为解决方案。通用解决方案也可以在这里工作吗?例如ObjectDataItem { 公共 T 值; },在序列化过程中值被转换为对象(意味着类型信息被保存为字符串),在反序列化过程中我将字符串转换回类型,并使用它来提供泛型类型参数并将对象转换为它?
  • 这将是一个棘手的实现不同类型的泛型集合。
  • 谢谢。我选择了对象和 XmlIgnore 类型变体。
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 2018-08-01
  • 2022-01-02
  • 1970-01-01
  • 2016-05-15
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多