代码之家  ›  专栏  ›  技术社区  ›  TheSean

如何用类型信息将对象序列化为文本?

  •  0
  • TheSean  · 技术社区  · 15 年前

    我想将对象序列化为文本,但我想保留类型信息,以便在不引用类型对象的情况下反序列化。

    XML序列化为我提供了所需的文本,但不保留类型信息。关于二进制序列化,我读到的是它保留类型信息,但不可读。看起来SoapFormater可以做我想做的,但我不确定这是否合适。

    我的目标是将序列化字符串粘贴到一个字符串对象中,该对象最终存储在数据库中的一列中(目前这超出了我的控制范围)。

    例如,我有一个基类:

    public class PluginSettings
    {
        private string name;
        public string Name { ... }
    }
    

    每个插件都可以从中派生以保存自己的设置。

    public class ACBPluginSettings : PluginSettings
    {
        private string mySetting;
        ...
    }
    

    我想到的可能的解决方案是: 使用BinaryFormatter,然后转换为base64字符串。这就完成了任务,但它不是人类可读的。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Chris Van Opstal    15 年前

    即使BinaryFormatter返回一个对象(或 object graph 实际上)您仍然需要将其强制转换为适当的类型。来自 MSDN example :

    BinaryFormatter formatter = new BinaryFormatter();
    Hashtable addresses = (Hashtable) formatter.Deserialize(fs);
    

    我想你会想做如下的事情:

    CustomObject obj = new CustomObject();
    formatter.Serialize(fs, obj);
    var deserializedObj = formatter.Deserialize(source);
    

    并且拥有 deserializedObj 键入为CustomObject。不幸的是,我不相信这是可能的(或者至少我想不出任何方法来完成它)。

        2
  •  0
  •   Jay    15 年前

    认为 那个 System.Runtime.Serialization.NetDataContractSerializer 可以做你想要的。

    来自MSDN:

    NetDataContractSerializer不同 从DataContractSerializer 重要途径: 这个 NetDataContractSerializer包括CLR 在序列化中键入信息 XML 而 DataContractSerializer没有。 因此, 可以使用NetDataContractSerializer 只有当序列化和 反序列化端共享同一个CLR 类型。