您的位置:首页 > 其它

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的输出,现在就来实现我们的需求。

但是我们采用声明的方式来解决这个问题,

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结构的输出通过声明方式很简单,但是通过编程方式也不是特别难,因为今天连着写了两篇博客,确实没精神了,写了将近两个小时。直呼 程序员 伤不起啊

一个人,如果你不逼自己一把,你根本不知道自己有多优秀。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐