我目前正在寻找一种简单的方法来序列化对象(在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标记中)不可行吗?
发布于 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);
}
}
}
发布于 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;
}
https://stackoverflow.com/questions/-100003185
复制相似问题