相关疑难解决方法(0)

使用StringWriter进行XML序列化

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

我用Google搜索了一些例子,并得出了类似的结果:

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());
Run Code Online (Sandbox Code Playgroud)

读完这个问题之后我问自己,为什么不使用StringWriter?看起来容易得多.

XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();
Run Code Online (Sandbox Code Playgroud)

另一个问题是,第一个示例生成的XML我不能只写入SQL Server 2005 DB的XML列.

第一个问题是:在我之后需要它作为字符串时,是否有理由不使用StringWriter序列化Object?在google搜索时,我从未找到使用StringWriter的结果.

第二个当然是:如果你不应该使用StringWriter(无论出于何种原因),这将是一个好的和正确的方法?


加成:

正如两个答案已经提到的那样,我将进一步讨论XML到DB的问题.

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

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

对于字符串

<?xml version="1.0" encoding="utf-8"?><test/>
Run Code Online (Sandbox Code Playgroud)

我从XmlTextWriter中获取了字符串,然后将xml放在那里.这个没有用(手动插入DB).

之后我尝试使用encoding ="utf-16"手动插入(只是编写INSERT INTO ...),这也失败了.删除编码完全有效.在那个结果之后我切换回StringWriter代码并且瞧 - 它工作了.

问题:我真的不明白为什么.

在Christian Hayter:通过这些测试,我不确定我是否必须使用utf-16来写入数据库.不会将编码设置为UTF-16(在xml标签中)吗?

c# xml sql-server utf-8 xml-serialization

94
推荐指数
4
解决办法
14万
查看次数

将XML插入SQL Server时如何解决"无法切换编码"错误

我正在尝试插入XML列(SQL SERVER 2008 R2),但服务器抱怨:

System.Data.SqlClient.SqlException(0x80131904):
XML解析:第1行,第39个字符,无法切换编码

我发现XML列必须是UTF-16才能使插入成功.

我正在使用的代码是:

 XmlSerializer serializer = new XmlSerializer(typeof(MyMessage));
 StringWriter str = new StringWriter();
 serializer.Serialize(str, message);
 string messageToLog = str.ToString();
Run Code Online (Sandbox Code Playgroud)

如何将对象序列化为UTF-8字符串?

编辑:好的,抱歉混淆 - 字符串需要是UTF-8.你是对的 - 默认情况下它是UTF-16,如果我尝试以UTF-8插入它就会通过.所以问题是如何序列化为UTF-8.

这会在尝试插入SQL Server时导致错误:

    <?xml version="1.0" encoding="utf-16"?>
    <MyMessage>Teno</MyMessage>
Run Code Online (Sandbox Code Playgroud)

这不是:

    <?xml version="1.0" encoding="utf-8"?>
    <MyMessage>Teno</MyMessage>
Run Code Online (Sandbox Code Playgroud)

更新

我想出当SQL Server 2008的Xml列类型需要utf-8时,以及当encoding你尝试插入xml规范的属性中的utf-16时:

如果要添加utf-8,请将参数添加到SQL命令,如下所示:

 sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd;
Run Code Online (Sandbox Code Playgroud)

如果您尝试encoding=utf-16在上一行中添加xmlValueToAdd,则会在插入中产生错误.此外,VarChar意味着国家字符不被识别(它们变成问号).

要将utf-16添加到db,请使用SqlDbType.NVarCharSqlDbType.Xml在前面的示例中,或者根本不指定type:

 sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));
Run Code Online (Sandbox Code Playgroud)

.net xml sql-server utf-8 utf-16

43
推荐指数
6
解决办法
7万
查看次数

实体框架存储XML数据类型; "无法切换编码"错误

我在使用.NET Framework 4.5的C#项目中使用Entity Framework 6.0.0版.我有一个Filing具有SQL Server列的类,该列XmlContentxml数据类型.我有数据库优先实体框架我主要用于保存Filing表中(我目前不读回那些行,如果这有所不同)

我已经阅读了这些关于使用Entity Framework保存到XML列的"字符串"支持属性的帖子,如此此处所述

我的XML声明看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
....
Run Code Online (Sandbox Code Playgroud)

我的实体框架自动生成(数据库优先)如下所示:

public partial class Filing
{
    // ...
    public string XmlContent { get; set; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用我的自定义分部类(保存到字符串属性...):

public partial class Filing
{
    [NotMapped]
    public XmlDocument XmlDocument
    {
        get
        {
            var xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(this.XmlContent);
            return xmlDocument;

        }
        set
        {
            this.XmlContent = value.OuterXml;
        }
    }
    // ...
} …
Run Code Online (Sandbox Code Playgroud)

c# xml entity-framework

6
推荐指数
0
解决办法
1643
查看次数

使用()并使用多个包装流进行处理

我是对的,如果你正在做的话,你只需要一个using()用于最外层的流

MemoryStream mstr = new MemoryStream();

using(StreamWriter w = new StreamWriter(mstr)) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

由于处理StreamWriter还应该处理/关闭底层流,没有必要这样做?:

using(MemoryStream mstr = new MemoryStream())
using(StreamWriter w = new StreamWriter(mstr)) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

(注意这些只是示例,关于如何处理包装的流,而不是寻找像使用StringWriter等的替代方案)

c# dispose stream

3
推荐指数
2
解决办法
3490
查看次数