.NET(C#):在数组成员上加入XmlElement特性

原文 www.cnblogs.com/mgen/archive/2011/12/04/2276131.html

当对如下类进行XML序列化时:

publicclassa

{

    publicint[] arr =newint[] { 1, 2, 3 };

}

 

结果会是:

<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <arr>

        <int>1</int>

        <int>2</int>

        <int>3</int>

    </arr>

</a>

 

数组字段会成为单独的XML元素。

而如果在类型的数组成员上加入XmlElement特性,生成的XML不会有最外的字段名称XML元素,比如这样:

publicclassa

{

    [XmlElement(Type =typeof(int))]

    publicint[] arr =newint[] { 1, 2, 3 };

}

 

结果会生成这样的XML:

<axmlns: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>

 

或许你在质疑这样的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))]

        publicint[] arr =newint[] { 1, 2, 3 };

    }

 

    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>

反序列化

1

2

3

 

你可以添加多个XmlElement特性(如果数组会指向派生类的数组)。比如a的arr字段是一个object数组:

publicobject[] arr =newobject[] { 12, "hehe", Guid.NewGuid() };

 

输出XML:

<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <arr>

        <anyTypexsi:type="xsd:int">12</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))]

publicobject[] arr =newobject[] { 12, "hehe", Guid.NewGuid() };

 

输出XML:

<axmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <int>12</int>

    <string>hehe</string>

    <guid>58359cd3-afe3-4650-b222-9b3ff5df186a</guid>

</a>

作者:Mgen
出处:www.cnblogs.com/mgen

其他参考页面:我的软件和工程博客导读

时间: 2024-09-11 22:12:16

.NET(C#):在数组成员上加入XmlElement特性的相关文章

结构体中的柔性数组成员(数组长度为0成员)!

其实很早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.但最新的C/C++不知道是

数组与指针的艺术 第八章 柔性数组成员

  数组与指针的艺术 第八章 柔性数组成员 收藏 注意:本系列文章转自 csdn博客 http://blog.csdn.net/supermegaboy/archive/2009/11/23/4855027.aspx 感谢飞天御女猪大牛! 在讲述柔性数组成员之前,首先要介绍一下不完整类型(incomplete type).不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象. 6.2.5 Types incomplete types (types that describe o

dfs-在使用DFS时,发生“无法在成员上读取 WMI 提供程序中的值”问题

问题描述 在使用DFS时,发生"无法在成员上读取 WMI 提供程序中的值"问题 我在使用Window Server 2012的DFS的文件复制功能时,文件不能成功复制. 生成的传播报告发生如下错误 我已经尝试重启dfs服务,并且执行了"wmiadap /f"命令仍然没有效果. 有没有遇到过同样问题的大侠,能够帮忙出出注意,不生感激. 在线等. 解决方案 http://wenku.baidu.com/link?url=cy-S9d-qgkrb97OQKcBi9VoI7

wcf-WCF中数据契约类包含数组成员时客户端报错,怎么解决

问题描述 WCF中数据契约类包含数组成员时客户端报错,怎么解决 WCF中数据契约类包含数组成员时客户端报错,怎么办呢?这个声明为数据契约的类是当成返回值传给客户端的,当数组成员赋值为null的时候客户端能正确接收到数据,但是当给这个数组成员赋予一个数组时客户端就不能读取这个返回的数据了.有高手有类似经验吗?望不啬赐教啊,很急 解决方案 你的数组元素的类型是什么,你的详细报错信息是什么 参考https://social.microsoft.com/Forums/nl-NL/da8c4e56-0a5

C语言实现在数组A上有序合并数组B的方法_C 语言

本文实例讲述了C语言实现在数组A上有序合并数组B的方法,分享给大家供大家参考.具体分析如下: 题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中 分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2) 由此可以写出下面的代码: #include <iostream> #include <algorithm> #include <iterator>

.NET(C#):XmlArrayItem特性和XmlElement特性在序列化数组的差别

原文http://www.cnblogs.com/mgen/archive/2011/12/04/2276238.html 比如这样一个类,我们用XmlArrayItem特性标明数组内出现的元素类型: publicclassa {     [XmlArrayItem(Type =typeof(int)), XmlArrayItem(Type =typeof(Guid)), XmlArrayItem(Type =typeof(string))]     publicobject[] arr =ne

C99 flexible array number 伸缩型数组成员

这种特性用来射你那个结构体中最后一个成员是特殊成员,它是不存在的 它包含如下规则: 1.必须是最后一个数组成员 2.结构体中至少有一个其他成员 3.使用[]进行定义 /*************************************************************************   > File Name: dongtai.c   > Author: gaopeng   > Mail: gaopp_200217@163.com   > Creat

web-仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用。

问题描述 仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用. 仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用. 解决方案 在.net3.5中,访问web服务,要对web服务添加修饰:[System.Web.Script.Services.ScriptService] 否则,当.ajax()请求服务时,会有异常:只能从脚本中调用在类定义上有[ScriptService]属性的 Web 服务 解决方案二: 在你的方法前面加上[

JS代码实例:遍历数组成员的迭代器

文章简介:实现一个遍历数组或对象里所有成员的迭代器. 实现一个遍历数组或对象里所有成员的迭代器. var each = function(obj, fn){         //+++++++++++答题区域+++++++++++                   //+++++++++++答题结束+++++++++++ };  try{                  var data1 = [4,5,6,7,8,9,10,11,12];         var data2 = {