【发布时间】:2010-12-06 14:07:50
【问题描述】:
我目前正在寻找一种简单的方法来序列化对象(在 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());
读完question之后,我问自己,为什么不用StringWriter呢?好像容易多了。
XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();
另一个问题是,第一个示例生成的 XML 我不能只写入 SQL Server 2005 DB 的 XML 列。
第一个问题是:当我需要它作为一个字符串时,我是否有理由不使用 StringWriter 序列化一个对象?谷歌搜索时,我从未使用 StringWriter 找到结果。
当然,第二个是:如果您不应该使用 StringWriter(无论出于何种原因)这样做,那将是一个好的和正确的方法?
加法:
正如两个答案已经提到的那样,我将进一步讨论 XML 到 DB 的问题。
写入数据库时出现以下异常:
System.Data.SqlClient.SqlException: XML 解析:第 1 行,第 38 个字符, 无法切换编码
对于字符串
<?xml version="1.0" encoding="utf-8"?><test/>
我把从 XmlTextWriter 创建的字符串作为 xml 放在那里。这一个不起作用(手动插入数据库也不行)。
之后,我尝试使用 encoding="utf-16" 手动插入(只是编写 INSERT INTO ... ),但也失败了。 然后完全删除编码。得到那个结果后,我切换回 StringWriter 代码,瞧——它起作用了。
问题:我真的不明白为什么。
在 Christian Hayter:通过这些测试,我不确定是否必须使用 utf-16 来写入数据库。那么将编码设置为 UTF-16(在 xml 标记中)不起作用吗?
【问题讨论】:
-
我将进行个人体验。 SQL Server 仅接受 UTF-16,如果您传递其他任何内容,您将受制于 SQL Server XML 解析器及其转换数据的尝试。我没有试图找到一种欺骗它的方法,而是直接将其传递为 UTF-16,这将始终有效。
-
你是如何将它写入数据库的?你是传递一个字符串,还是一个字节数组,还是写入一个流?如果是后两种形式之一,则需要确保声明的编码与二进制数据的实际编码匹配。
-
唷。我在 MS SQL Management Studio 中作为查询进行的手动尝试。 “编码”尝试被写入一个字符串,然后传递给一个 O/R 映射器,该映射器作为一个字符串写入(据我所知)。事实上,我将在我的问题中给出的两个示例中创建的字符串传递给它。
-
我正在更改我接受的答案,因为我相信它实际上回答了我的问题。尽管其他答案帮助我继续我的工作,但出于 Stackoverflow 的目的,我认为所罗门的答案将帮助其他人更好地理解发生了什么。 [免责声明]:我没有时间真正验证答案。
标签: c# sql-server xml utf-8 xml-serialization