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

简介: 原文 www.cnblogs.com/mgen/archive/2011/12/04/2276131.html 当对如下类进行XML序列化时: publicclassa {     publicint[] arr =newint[] { 1, 2, 3 }; }   结果会是:             1         2         3       数组字段会成为单独的XML元素。

原文 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
其他参考页面:我的软件和工程博客导读

目录
相关文章
|
2月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
2月前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
2月前
|
存储 C#
C#学习系列相关之数组(一)---数组的定义与使用
C#学习系列相关之数组(一)---数组的定义与使用
|
4月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
4月前
|
编译器 C# 开发者
C# 9.0中的顶级语句:简化程序入口的新特性
【1月更文挑战第13天】本文介绍了C# 9.0中引入的顶级语句(Top-level statements)特性,该特性允许开发者在不使用传统的类和方法结构的情况下编写简洁的程序入口代码。文章详细阐述了顶级语句的语法、使用场景以及与传统程序结构的区别,并通过示例代码展示了其在实际应用中的便捷性。
|
5月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
40 0
|
7月前
|
开发框架 .NET C#
c#数组补充
c#数组的几个简单的补充
27 0
|
13天前
|
机器学习/深度学习 存储 开发工具
【专栏】解读 .NET 技术的先进特性
【4月更文挑战第29天】.NET 技术推动各行业软件开发创新,提供高效开发环境(如Visual Studio)和跨平台能力(.NET Core),支持多语言和函数式编程。其生态系统繁荣,NuGet包含大量开源库。同时,.NET整合云服务(Azure)和机器学习(ML.NET),强化应用扩展性和智能处理,巩固其在现代开发中的关键角色。
|
2月前
|
C#
C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
39 1
|
4月前
|
存储 C# C++
C# 笔记2 - 数组、集合与与文本文件处理
C# 笔记2 - 数组、集合与与文本文件处理
48 0