【问题标题】:Save datacontract serialized object as string to save in sql db将datacontract序列化对象保存为字符串以保存在sql db中
【发布时间】:2011-12-02 07:22:01
【问题描述】:

我有一个自定义类型 UserSettingConfig 我想保存在我的数据库中,我想将它保存为纯 XML,因为以后可能会更改类型,并且迁移纯 xml 比二进制对象更容易。

    public class Serialize
{
    private readonly DataContractSerializer _serializer;

    public Serialize()
    {
        _serializer = new DataContractSerializer(typeof(UserSettingConfig));
    }

    public string SerializeObject(UserSettingConfig userSettingConfig)
    {
        using (var memoryStream = new MemoryStream())
        {
            _serializer.WriteObject(memoryStream, userSettingConfig);

            string userSettingXml = memoryStream.ToString();

            memoryStream.Close();

            return userSettingXml;
        }
    }

    public UserSettingConfig DeSerializeObject(string userSettingXml)
    {
        UserSettingConfig userSettingConfig;

        using (var stream = new MemoryStream(userSettingXml))
        {
            stream.Position = 0;
            userSettingConfig = (UserSettingConfig)_serializer.ReadObject(stream);
        }

        return userSettingConfig;
    }
}

这不起作用,因为内存流需要字节数组或 int

我希望我的序列化返回一个字符串(我可以在我的数据库中保存为 varchar(MAX))

【问题讨论】:

    标签: c# sql xml


    【解决方案1】:

    DataContractSerializer.WriteObject 有一个采用XmlWriter 的重载。您可以构造其中一个将 XML 写入StringBuilder

    private static string SerializeToString(object objectToSerialize)
    {
      var serializer = new DataContractSerializer(objectToSerialize.GetType());
      var output = new StringBuilder();
      var xmlWriter = XmlWriter.Create(output);
    
      serializer.WriteObject(xmlWriter, objectToSerialize);
      xmlWriter.Close();
    
      return output.ToString();
    }
    

    【讨论】:

      【解决方案2】:

      您也可以考虑使用出色的 JSON.NET 库序列化为 JSON 而不是 XML,该库甚至可以轻松序列化最复杂的对象。 JSON 非常紧凑,仍然可读。

      序列化:

      string json =  Newtonsoft.Json.JavaScriptConvert.SerializeObject(anySerializableObject);
      

      反序列化:

      MyClass instance = (MyClass) Newtonsoft.Json.JavaScriptConvert.DeserializeObject(json, typeof(MyClass));
      

      【讨论】:

      • 这不是一个开源项目,并且有一个闭源许可证:/
      • JSON.NET 使用 MIT 许可证获得许可。根据 Wikipedia 的说法,“[...] 专有软件保留了其专有性质,即使它包含了 MIT 许可下的软件”。 en.wikipedia.org/wiki/MIT_License
      【解决方案3】:

      如果你需要没有 xml 声明的 xml,你应该使用 XmlWriterSettings。例如,当您需要节点的 xml 字符串而不是整个 xml 文档时。

      private static string SerializeToString(object objectToSerialize)
      {
        var serializer = new DataContractSerializer(objectToSerialize.GetType());
        var output = new StringBuilder();
        var xmlWriter = XmlWriter.Create(output,  new XmlWriterSettings() { OmitXmlDeclaration = true});
      
        serializer.WriteObject(xmlWriter, objectToSerialize);
        xmlWriter.Close();
      
        return output.ToString();
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-01
        • 2022-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 2017-01-23
        相关资源
        最近更新 更多