我正在寻找一种简单的方法来序列化对象(在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标签中)吗?
我正在尝试插入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.NVarChar或SqlDbType.Xml在前面的示例中,或者根本不指定type:
sqlcmd.Parameters.Add(new SqlParameter("ParamName", xmlValueToAdd));
Run Code Online (Sandbox Code Playgroud) 我在使用.NET Framework 4.5的C#项目中使用Entity Framework 6.0.0版.我有一个Filing具有SQL Server列的类,该列XmlContent是xml数据类型.我有数据库优先实体框架我主要用于将行保存到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) 我是对的,如果你正在做的话,你只需要一个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等的替代方案)