wcf 基础教程 契约 Contract 控制xml输出 数据契约DataContract序列化前身 XmlSerializer xml序列化

简介: 在上一篇博客介绍了xml序列化的原则,wcf 基础教程 契约 Contract 数据契约DataContract序列化前身 XmlSerializer xml序列化, 今天我们沿着上次描述的继续前进,这次的内容可能会很少,但是应该说如果我们想更进一步的控制xml,那么还是很有必要的。

在上一篇博客介绍了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的输出,现在就来实现我们的需求。

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

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Xml;
  6 using System.Xml.Serialization;
  7 using System.Diagnostics;
  8 
  9 namespace Chinaer.WcfDemo.ConsoleClient
 10 {
 11     class Program
 12     {
 13         static void Main(string[] args)
 14         {
 15             //Person person = new Person(25, Guid.NewGuid())
 16             //{
 17             //    Date = DateTime.Now
 18             //};
 19             //person.UserName = "guozhiqi";
 20             ////person.UserPwd = "123";
 21             //Serialize<Person>(person, "person.xml");
 22             Person person = new Person()
 23             {
 24                 Age = 12,
 25                 UserPwd = "21",
 26                 UserName = "郭志奇",
 27                 Date = DateTime.Now
 28             };
 29           
 30             using (XmlWriter writer = new XmlTextWriter("person.xml", Encoding.UTF8))
 31             {
 32                 XmlSerializer serializer = new XmlSerializer(typeof(Person));
 33                 serializer.Serialize(writer, person);
 34             }
 35 
 36             Process.Start("person.xml");
 37             Console.Read();
 38         }
 39 
 40         /// <summary>
 41         /// 序列化方法
 42         /// </summary>
 43         /// <typeparam name="T"></typeparam>
 44         /// <param name="instace"></param>
 45         /// <param name="fileName"></param>
 46         public static void Serialize<T>(T instace, string fileName)
 47         {
 48             using (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
 49             {
 50                 XmlSerializer serializer = new XmlSerializer(typeof(T));
 51                 serializer.Serialize(writer, instace);
 52             }
 53             Process.Start(fileName);
 54         }
 55     }
 56     [XmlRoot(ElementName="guozhiqi",Namespace="http://www.guozhiqi.com")]
 57     /// <summary>
 58     /// 定义一个实体类 Person
 59     /// </summary>
 60     public class Person
 61     {
 62         private Guid _id;
 63 
 64         private DateTime _date;
 65         //注意我们没有默认的构造函数
 66         internal double Age { get; set; } //私有字段 年龄
 67         /// <summary>
 68         /// 通过XmlAttributeAttribute 序列化成xml属性
 69         /// </summary>
 70         [XmlAttribute(AttributeName="GuidID",Namespace="http://guidID")]
 71         public Guid ID
 72         {
 73             get { return _id; }
 74             set
 75             {
 76                 _id = value;
 77             }
 78         } //公有的随机数
 79         [XmlElement(ElementName="DateTime",Namespace="http://date")]
 80         public DateTime Date
 81         {
 82             set
 83             {
 84                 _date = value;
 85             }
 86             get
 87             {
 88                 return _date;
 89             }
 90         }
 91 
 92         public string UserName { get; set; }
 93 
 94         public string UserPwd { get; set; }
 95         public Person() { }
 96         public Person(double age, Guid id)
 97         {
 98             this.Age = age;
 99 
100         }
101     }
102 
103 }

请注意上面的代码,我们先贴出来生成的xml,对比着看比较容易。

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

一个人,如果你不逼自己一把,你根本不知道自己有多优秀。

 

我又回来了,回到了技术最前线,
相关文章
|
2月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
47 1
|
3月前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
132 7
使用Java和XPath在XML文档中精准定位数据
|
15天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
XML 存储 数据格式
|
2月前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
51 2
|
1月前
|
XML Web App开发 数据格式
HTML 页面显示 XML 数据
10月更文挑战第2天
|
1月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
371 0
|
3月前
|
存储 C# 数据库
解决C#对Firebase数据序列化失败的难题
在游戏开发中,Unity结合Firebase实时数据库为开发者提供强大支持,但在C#中进行数据序列化和反序列化时常遇难题。文章剖析了数据丢失或反序列化失败的原因,并给出解决方案,包括使用`JsonUtility`、确保字段标记为`[Serializable]`以及正确配置网络请求。示例代码演示了如何在Unity环境中实现Firebase数据的序列化和反序列化,并通过设置代理IP、Cookies和User-Agent来增强网络请求的安全性。这些技巧有助于确保数据完整传输,提升开发效率。
解决C#对Firebase数据序列化失败的难题
|
3月前
|
存储 分布式计算 Java
|
3月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
90 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧