首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用StringWriter实现XML序列化?

如何使用StringWriter实现XML序列化?
EN

Stack Overflow用户
提问于 2018-03-12 05:59:51
回答 2查看 0关注 0票数 0

我目前正在寻找一种简单的方法来序列化对象(在C#3中)。

我在谷歌上搜索了一些例子,并想出了如下内容:

MemoryStream memoryStream = new MemoryStream ( );
XmlSerializer xs = new XmlSerializer ( typeof ( MyObject) );
XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 );
xs.Serialize ( xmlTextWriter, myObject);
string result = Encoding.UTF8.GetString(memoryStream .ToArray());

使用StringWriter:

XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();

另一个问题是,第一个生成XML的示例不能只将XML写入SQLServer 2005 DB的XML列。

第一个问题是:当我以后需要一个字符串时,我为什么不应该使用StringWriter来序列化对象呢?在谷歌搜索时,我从未使用StringWriter找到结果。

第二个当然是:如果您不应该使用StringWriter(出于任何原因),那么这将是一种好的、正确的方法?

增添:

正如两个答案都提到的,我将进一步讨论XML到DB问题。

在写入数据库时,我得到了以下异常:

System.Data.SqlClients.qlException:XML解析:第1行,字符38,无法切换编码

用于字符串

<?xml version="1.0" encoding="utf-8"?><test/>

我将从XmlTextWriter创建的字符串放在那里作为XML。这个程序没有工作(手动插入DB也不行)。

将编码设置为UTF-16(在XML标记中)不可行吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-12 14:26:35

当将XML文档序列化为.NET字符串时,编码必须设置为UTF-16。字符串在内部存储为UTF-16,因此这是唯一有意义的编码。如果要以不同的编码方式存储数据,则使用字节数组。

SQLServer的工作原理类似;任何传递给xml列必须编码为UTF-16。SQLServer将拒绝XML声明未指定UTF-16的任何字符串。如果XML声明不存在,那么XML标准要求它默认为UTF-8,所以SQL Server也会拒绝它。

考虑到这一点,下面是一些执行转换的实用方法。

public static string Serialize<T>(T value) {

    if(value == null) {
        return null;
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings()
    {
        Encoding = new UnicodeEncoding(false, false), // no BOM in a .NET string
        Indent = false,
        OmitXmlDeclaration = false
    };

    using(StringWriter textWriter = new StringWriter()) {
        using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) {
            serializer.Serialize(xmlWriter, value);
        }
        return textWriter.ToString();
    }
}

public static T Deserialize<T>(string xml) {

    if(string.IsNullOrEmpty(xml)) {
        return default(T);
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlReaderSettings settings = new XmlReaderSettings();
    // No settings need modifying here

    using(StringReader textReader = new StringReader(xml)) {
        using(XmlReader xmlReader = XmlReader.Create(textReader, settings)) {
            return (T) serializer.Deserialize(xmlReader);
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-12 15:38:15

public sealed class StringWriterWithEncoding : StringWriter
{
    public override Encoding Encoding { get; }

    public StringWriterWithEncoding (Encoding encoding)
    {
        Encoding = encoding;
    }    
}

或者如果你只需要UTF-8:

public sealed class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding => Encoding.UTF8;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档