.NET(C#):在数组成员上加入XmlElement特性
原文 www.cnblogs.com/mgen/archive/2011/12/04/2276131.html
当对如下类进行XML序列化时:
publicclassa
{
};
}
结果会是:
<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<arr>
</int>
</int>
</int>
</arr>
</a>
数组字段会成为单独的XML元素。
而如果在类型的数组成员上加入XmlElement特性,生成的XML不会有最外的字段名称XML元素,比如这样:
publicclassa
{
[XmlElement(Type =typeof(int))]
};
}
结果会生成这样的XML:
<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</arr>
</arr>
</arr>
</a>
或许你在质疑这样的XML能不能被正确得反序列化?我开始也是这样想的,结果就是可以被成功反序列化,全部代码:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace Mgen
{
publicclassa
{
[XmlElement(Type =typeof(int))]
};
}
classProgram
{
staticvoid Main()
{
var xs =newXmlSerializer(typeof(a));
using (var textWriter =newStringWriter())
{
Console.WriteLine("序列化");
xs.Serialize(textWriter, newa());
Console.WriteLine(textWriter);
Console.WriteLine("反序列化");
var obj = (a)xs.Deserialize(newStringReader(textWriter.ToString()));
foreach (var i in obj.arr)
Console.WriteLine(i);
}
}
}
}
程序会输出:
序列化
<?xml version="1.0" encoding="utf-16"?>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<arr>1</arr>
<arr>2</arr>
<arr>3</arr>
</a>
反序列化
你可以添加多个XmlElement特性(如果数组会指向派生类的数组)。比如a的arr字段是一个object数组:
, "hehe", Guid.NewGuid() };
输出XML:
<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<arr>
</anyType>
<anyTypexsi:type="xsd:string">hehe</anyType>
<anyTypexmlns:q1="http://microsoft.com/wsdl/types/"
xsi:type="q1:guid">a4efc250-d935-4925-836e-d4b4b089e3fe</anyType>
</arr>
</a>
注意object对应的XML元素是<anyType>,然后xsi:type属性是具体的类型。
如果在字段arr上加入XmlElement特性:
[XmlElement(Type =typeof(int)), XmlElement(Type =typeof(Guid)), XmlElement(Type =typeof(string))]
, "hehe", Guid.NewGuid() };
输出XML:
<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</int>
<string>hehe</string>
<guid>58359cd3-afe3-4650-b222-9b3ff5df186a</guid>
</a>
作者:Mgen
出处:www.cnblogs.com/mgen
.NET(C#):在数组成员上加入XmlElement特性的更多相关文章
- 第 14 章 结构和其他数据形式(伸缩型数组成员C99)
伸缩型数组成员C99 声明一个伸缩型数组成员的规则: 1.伸缩型数组成员必须是结构的最后一个成员: 2.结构中必须至少有一个成员: 3.伸缩数组的方括号是空的. 示例 struct flex { in ...
- c/c++柔性数组成员
柔性数组成员 定义和声明分离 #include <stdio.h> //只是告诉编译器,当编译到使用到这个函数的的代码时,虽然还没有找到函数定义的实体,但是也让它编译不出错误. exter ...
- 柔性数组成员 (flexible array member)-C99-ZZ
学习flexible array member是因为阅读Redis源码遇到的,sds.h中一开始就用到了. ============================================== ...
- .NET(C#):XmlArrayItem特性和XmlElement特性在序列化数组的差别
原文http://www.cnblogs.com/mgen/archive/2011/12/04/2276238.html 比如这样一个类,我们用XmlArrayItem特性标明数组内出现的元素类型: ...
- Java使用foreach语句对数组成员遍历输出
/** * 本程序使用foreach语句对数组成员进行遍历输出 * @author Lei * @version 2018-7-23 */ public class ForeachDemo { pub ...
- Effective JavaScript Item 51 在类数组对象上重用数组方法
Array.prototype对象上的标准方法被设计为也能够在其他对象上重用 - 即使不是继承自Array的对象. 因此,在JavaScript中存折一些类数组对象(Array-like Object ...
- 基于原生JS封装数组原型上的sort方法
基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...
- 使用foreach语句对数组成员进行遍历
/*** 使用foreach语句对数组成员进行遍历* **/ public class ForeachDemo { public static void main(String[] args) { i ...
- 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类
一.对象的扩展 1.1对象属性名表达式 ES6可以在JSON中使用[]包裹一个key的名字.此时这个key将用表达式作为属性名(被当做变量求值),这个key值必须是字符串. var a = 'name ...
随机推荐
- 最大流算法----(SAP 和 EK)
EK算法的核心 反复寻找源点 s 到汇点 t 之间的增广路径,若有,找出增广路径上每一段的最小值delta,若无,则结束. 寻找增广路径时用BFS来找,并且更新残留网的值. 找到delta后,则使最大 ...
- jQuery 源码分析和使用心得 - core.js
core是jQuery的核心内容, 包含了最基础的方法, 比如我们常用的 $(selector, context), 用于遍历操作的 each, map, eq, first 识别变量类型的 isAr ...
- CSS自学笔记(7):CSS定位
很多时候,我们需要对一些元素进行自定义排序.布局等,这是就需要用到CSS的定位属性了,用这些属性对一些元素进行自定义排序.布局等操作,可以改变浏览器默认的死板的排序. CSS定位的功能很容易理解,它允 ...
- Oracle EBS-SQL (BOM-1):检查供应类型错误.sql
--检查供应类型错误 SELECT MSI.SEGMENT1 物料编码, MSI.DESCRIPTION 物料描述, DECODE(MSI.WIP ...
- 一个简单的RTTI实现
RTTI是"Runtime Type Information"的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法. 最近在写的一些东西,不想使用MFC之类的框架,但是 ...
- Android_Intent意图详解
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/11863857 1.Intent作用 Intent是一个将要执行的动作 ...
- Mayor's posters(离散化线段树)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 54067 Accepted: 15713 ...
- UVA 12075 - Counting Triangles(容斥原理计数)
题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...
- TASKKILL命令使用方法
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM ima ...
- 如何学习.Net的步骤
如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET 我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET. ASP. ...