我正在寻找一种简单的方法来序列化对象(在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标签中)吗?
假设我有一个名为Song的XML可序列化类:
[Serializable]
class Song
{
public string Artist;
public string SongTitle;
}
Run Code Online (Sandbox Code Playgroud)
为了节省空间(并且还对XML文件进行半混淆),我决定重命名xml元素:
[XmlRoot("g")]
class Song
{
[XmlElement("a")]
public string Artist;
[XmlElement("s")]
public string SongTitle;
}
Run Code Online (Sandbox Code Playgroud)
这将生成如下的XML输出:
<Song>
<a>Britney Spears</a>
<s>I Did It Again</s>
</Song>
Run Code Online (Sandbox Code Playgroud)
我想重命名/重新映射类/对象的名称.比如,在上面的例子中,我希望将类Song重命名为g.因此,生成的xml应如下所示:
<g>
<a>Britney Spears</a>
<s>I Did It Again</s>
</g>
Run Code Online (Sandbox Code Playgroud)
是否可以通过xml-attributes重命名类名?
我不希望手动创建/遍历DOM,所以我想知道它是否可以通过装饰器实现.
提前致谢!
更新:哎呀!这次我真的再次做到了!忘了提 - 我实际上是在序列化XML中的Song对象列表.
这是序列化代码:
public static bool SaveSongs(List<Song> songs)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
using (TextWriter textWriter = new …Run Code Online (Sandbox Code Playgroud) 我们有以下代码:
[Serializable]
public class Class1
{
[XmlElement("description")]
public string Description { get; set; }
}
class Program
{
static void Main(string[] args)
{
var list = new List<Class1> {new Class1() {Description = "Desc1"}, new Class1() {Description = "Desc2"}};
var serializer = new XmlSerializer(typeof(List<Class1>), new XmlRootAttribute("root"));
var ms = new MemoryStream();
serializer.Serialize(ms, list);
ms.Position = 0;
var result = new StreamReader(ms).ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
执行后,我们将在'result'变量中包含以下内容:
<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Class1>
<description>Desc1</description>
</Class1>
<Class1>
<description>Desc2</description>
</Class1>
</root>
Run Code Online (Sandbox Code Playgroud)
问题是:如何在不更改类名的情况下将xml元素名称从"Class1"更改为"Item1"?
我正在尝试做看似简单的任务,但事实证明它相当复杂。
.NET 的System.Xml.Serialization命名空间似乎在支持静态 XML 结构方面做得非常好,但对动态结构的支持却不太好。
我正在尝试建立一个 XML 文档,其中的元素的子元素可以具有多种类型中的一种并且可以按任意顺序排列。据我了解,您可以通过以下方式命名具有相同名称的子元素列表:
[Serializable]
[XmlRoot("Parent")]
public class MyElement
{
[XmlElement("Child")]
public string[] MyChildren { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这将导致 XML 看起来像这样:
<Parent>
<Child></Child>
...
<Child></Child>
</Parent>
Run Code Online (Sandbox Code Playgroud)
我正在尝试建立一个如下所示的结构:
<Parent>
<ChildTypeA></ChildTypeA>
<ChildTypeB></ChildTypeB>
...
<ChildTypeZ></ChildTypeZ>
</Parent>
Run Code Online (Sandbox Code Playgroud)
它们没有特定的顺序,并且类型可以出现多次。我看到了一些答案,人们建议在类上使用XmlType属性来声明元素名称,但从那时到现在,功能似乎发生了变化,因为该类型所做的只是声明元素的架构类型:
[Serializable]
[XmlRoot("Parent")]
public class MyElement
{
[XmlElement]
public BaseChildElement[] MyChildren { get; set; }
}
[Serializable]
public abstract class BaseChildElement {}
[Serializable]
[XmlType("ChildTypeA")]
public class ChildElementA : BaseChildElement
{
[XmlAttribute]
public string Content { get; set; } …Run Code Online (Sandbox Code Playgroud) 我想为泛型类创建一个xml.其中一个属性具有泛型类型.对于此属性,我不希望将属性名称用作其XML元素名称,而是使用泛型类型的名称.
这个类看起来像这样:
[XmlRoot("Entity")]
public class StoreItem<TEntity>
where TEntity : class, new()
{
/// <summary>
/// Gets and sets the status of the entity when storing.
/// </summary>
[XmlAttribute]
public System.Data.Services.Client.EntityStates Status { get; set; }
/// <summary>
/// Gets and sets the entity to be stored.
/// </summary>
public TEntity Entity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在序列化某种商店项目时StoreItem<SewageArea>,XML应包含以下内容:
<Entity Status="Deleted">
<SewageArea ...>
...
</SewageArea>
<Entity>
Run Code Online (Sandbox Code Playgroud)
要求是,SewageArea上面的例子应该以"正常"方式序列化.另一个重要的事情是,如果可能的话,代码应该准备好在类中自动序列化新添加的属性StoreItem.