wcf 基础教程 契约 Contract 控制xml输出 数据契约DataContract序列化前身 XmlSerializer xml序列化
2013-03-21 23:39
711 查看
在上一篇博客介绍了xml序列化的原则,wcf 基础教程 契约 Contract 数据契约DataContract序列化前身 XmlSerializer xml序列化, 今天我们沿着上次描述的继续前进,这次的内容可能会很少,但是应该说如果我们想更进一步的控制xml,那么还是很有必要的。好了,不多说了,xml序列化使用的是.Net 中的XmlSerializer,在System.Xml.Serialization.XmlSerializer 命名空间下。上次仅仅是XmlSerializer 采用的默认的序列化规则。很多情况下,我们需要控制xml的输出,那么就需要我们人为的干预和控制。
在xml序列化过程中,如果我们定义了一个A,A继承自B,但是如果我们是通过B的序列化不能应用于A。这是什么意思呢?也就是说如果我们序列化的时候是B作为类型,那么我们在反序列化的时候也必须反序列化为B,而不能是A。这个有点复杂,需要我们慢慢体会。我也理解的不是特别透彻。
在上一篇博客中,我们生成的xml中 XmlElement只是单纯的属性名称,如果我们想为属性名称添加命名空间应该怎么做呢?有码有真相
其实最主要的是XmlAttributeOverrides 和XmlAttributes 来实现控制xml的输出,现在就来实现我们的需求。
但是我们采用声明的方式来解决这个问题,
请注意上面的代码,我们先贴出来生成的xml,对比着看比较容易。
我们看到在字段或属性上应用XmlAttributeAttribute 特性将其序列化为Xml属性,同时可以指定名称(别名)或命名空间。
通过在字段或属性上应用XmlElementAttribute特性将其序列化为Xml元素,可以指定Name、NameSpace和Order 排序。至于xml属性和元素有什么区别,大家可以搜索一下。其中区别很小。
控制xml结构的输出通过声明方式很简单,但是通过编程方式也不是特别难,因为今天连着写了两篇博客,确实没精神了,写了将近两个小时。直呼 程序员 伤不起啊
一个人,如果你不逼自己一把,你根本不知道自己有多优秀。
在xml序列化过程中,如果我们定义了一个A,A继承自B,但是如果我们是通过B的序列化不能应用于A。这是什么意思呢?也就是说如果我们序列化的时候是B作为类型,那么我们在反序列化的时候也必须反序列化为B,而不能是A。这个有点复杂,需要我们慢慢体会。我也理解的不是特别透彻。
在上一篇博客中,我们生成的xml中 XmlElement只是单纯的属性名称,如果我们想为属性名称添加命名空间应该怎么做呢?有码有真相
其实最主要的是XmlAttributeOverrides 和XmlAttributes 来实现控制xml的输出,现在就来实现我们的需求。
但是我们采用声明的方式来解决这个问题,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Serialization; using System.Diagnostics; namespace Chinaer.WcfDemo.ConsoleClient { class Program { static void Main(string[] args) { //Person person = new Person(25, Guid.NewGuid()) //{ // Date = DateTime.Now //}; //person.UserName = "guozhiqi"; ////person.UserPwd = "123"; //Serialize<Person>(person, "person.xml"); Person person = new Person() { Age = 12, UserPwd = "21", UserName = "郭志奇", Date = DateTime.Now }; using (XmlWriter writer = new XmlTextWriter("person.xml", Encoding.UTF8)) { XmlSerializer serializer = new XmlSerializer(typeof(Person)); serializer.Serialize(writer, person); } Process.Start("person.xml"); Console.Read(); } /// <summary> /// 序列化方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instace"></param> /// <param name="fileName"></param> public static void Serialize<T>(T instace, string fileName) { using (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8)) { XmlSerializer serializer = new XmlSerializer(typeof(T)); serializer.Serialize(writer, instace); } Process.Start(fileName); } } [XmlRoot(ElementName="guozhiqi",Namespace="http://www.guozhiqi.com")] /// <summary> /// 定义一个实体类 Person /// </summary> public class Person { private Guid _id; private DateTime _date; //注意我们没有默认的构造函数 internal double Age { get; set; } //私有字段 年龄 /// <summary> /// 通过XmlAttributeAttribute 序列化成xml属性 /// </summary> [XmlAttribute(AttributeName="GuidID",Namespace="http://guidID")] public Guid ID { get { return _id; } set { _id = value; } } //公有的随机数 [XmlElement(ElementName="DateTime",Namespace="http://date")] public DateTime Date { set { _date = value; } get { return _date; } } public string UserName { get; set; } public string UserPwd { get; set; } public Person() { } public Person(double age, Guid id) { this.Age = age; } } }
请注意上面的代码,我们先贴出来生成的xml,对比着看比较容易。
<?xml version="1.0" encoding="utf-8"?> <guozhiqi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" d1p1:GuidID="00000000-0000-0000-0000-000000000000" xmlns:d1p1="http://guidID" xmlns="http://www.guozhiqi.com"> <DateTime xmlns="http://date">2013-03-21T23:31:13.8584896+08:00</DateTime> <UserName>郭志奇</UserName><UserPwd>21</UserPwd></guozhiqi>
我们看到在字段或属性上应用XmlAttributeAttribute 特性将其序列化为Xml属性,同时可以指定名称(别名)或命名空间。
通过在字段或属性上应用XmlElementAttribute特性将其序列化为Xml元素,可以指定Name、NameSpace和Order 排序。至于xml属性和元素有什么区别,大家可以搜索一下。其中区别很小。
控制xml结构的输出通过声明方式很简单,但是通过编程方式也不是特别难,因为今天连着写了两篇博客,确实没精神了,写了将近两个小时。直呼 程序员 伤不起啊
一个人,如果你不逼自己一把,你根本不知道自己有多优秀。
相关文章推荐
- wcf 基础教程 契约 Contract 数据契约DataContract序列化前身 XmlSerializer xml序列化
- wcf基础教程之 数据契约的序列化DataContractSerializer
- wcf 基础教程 之已知类型KnownType 数据契约序列化DataContractSerializer
- wcf基础教程之 数据契约的序列化DataContractSerializer
- 数据契约(DataContract)及序列化指定输出字段
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
- WCF 数据契约(DataContract)
- XML序列化与REST WCF Data Contract匹配时遇到的2个问题
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
- WCF 学习之数据契约(DataContract)
- [原创]WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
- WCF基础教程(四)——数据契约实现传送自定义数据类型
- wcf基础教程之 契约(合同)Contract
- [原创]WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- WCF中的数据契约(DataContract)
- wcf基础教程之 契约(合同)Contract
- WCF数据契约(DataContract)