.NET XML 串行化讲座

2024-01-15 04:48
文章标签 xml 讲座 net 串行化

本文主要是介绍.NET XML 串行化讲座,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,浅串行化:只串行化类的公共字段和属性
    公共属性必须是可读且可写的
    使用命名空间:using System.Xml.Serialization;

    以Book类为例:
    串行化模板:

         public   void  SerializeIt( string  filename)
        
{
            XmlSerializer serializer 
= new XmlSerializer(typeof(Book));
            StreamWriter writer 
= new StreamWriter(filename);
            Book myBook 
= new Book();

            serializer.Serialize(writer, myBook);
            writer.Close();
        }

    
    反串行化模板:

         public   void  DeserializeIt( string  filename)
        
{
            XmlSerializer serializer 
= new XmlSerializer(typeof(Book));
            FileStream fs 
= new FileStream(filename, FileMode.Open);
            Book myBook 
= (Book)serializer.Deserialize(fs);
            fs.Close();
        }


*使用XmlSerializer的类必须有一个不带参数的默认构造函数——在反串行化中使用
*序列化ArrayList类型字段X的特殊处理:在ctor中 this.X = new ArrayList();
*对于引用关系,如果A中引用了B,那么
    在序列化A的时候,会生成如下格式的XML:
    <A>
        <B>xxxxx</B>
    </A>
    在反序列化A对象的时候,A中也会包含有具体值的B对象
*浅序列化不支持循环引用,即A引用B的同时,B也引用了A

序列化时,将XML格式定制为SOAP格式:使用XmlSerializer构造函数的另一个重载:

         public   void  SerializeIt( string  filename)
        
{
            SoapReflectionImporter import 
= new SoapReflectionImporter();
            XmlTypeMapping soapMapping 
= import.ImportTypeMapping(typeof(Book));

            XmlSerializer serializer 
= new XmlSerializer(soapMapping);


            StreamWriter writer 
= new StreamWriter(filename);
            Book myBook 
= new Book();

            serializer.Serialize(writer, myBook);
            writer.Close();
        }

 

2,深串行化:串行化对象的整个状态
    使用命名空间:

using  System.IO;
using  System.Runtime.Serialization;
using  System.Runtime.Serialization.Formatters.Binary;
using  System.Runtime.Serialization.Formatters.Soap;

    串行化类的标志:在类前加上[Serializable]特性
    两种格式器:BinaryFormatter,SoapFormatter

    以BinaryFormatter为例(SoapFormatter与之相同)
    串行化模板:

         public   void  SerializeIt( string  filename)
        
{
            Book myBook 
= new Book();

            BinaryFormatter formatter 
= new BinaryFormatter();
            FileStream fs 
= File.Create(filename);
            formatter.Serialize(fs, myBook);
            fs.Close();
        }

    反串行化模板:

         public   void  DeserializeIt( string  filename)
        
{
            BinaryFormatter formatter 
= new BinaryFormatter();
            FileStream fs 
= File.OpenRead(filename);
            Book myBook 
= (Book)formatter.Deserialize(fs);
            fs.Close();
        }

*在字段上加上[NonSerialized],可以不使该字段被序列化
*对于引用关系,如果A中引用了B,A和B类都要加上[Serializable],才能对A进行串行化
*对于循环引用,只支持对象图的循环引用,不支持广义的对象循环引用
    对象图循环引用的例子:

    [Serializable]
    
public   class  Book
    
{
        
private BookCatalog includeInBookCatalog;

        
public BookCatalog IncludeInBookCatalog
        
{
            
get return includeInBookCatalog; }
            
set { includeInBookCatalog = value; }
        }

    }


    [Serializable]
    
public   class  BookCatalog
    
{
        
private Book[] books;

        
public Book[] Books
        
{
            
get return books; }
            
set 
            

                books 
= value;

                
foreach (Book book in books)
                
{
                    book.IncludeInBookCatalog 
= this;
                }

            }

        }

    }

BookCatalog进行深度序列化,不会造成循环引用,因为格式化器Formatter知道无论对象有多少个引用,保证每个对象只串行化一次——通过System.Runtime.Serialization下的两个类实现:ObjectManagerObjectIDGenerator
    ObjectManager        负责在对象反串行化时跟踪对象,确定该对象是否串行化过
    ObjectIDGenerator  为每个被跟踪的对象加一个唯一的ID以区别,根据对象是否被串行化,ObjectIDGenerator知道是返回已有的ID,还是生成一个新的ID
格式化器不会提前检查所有的对象可串行化,中途如果发生异常,可以已经生成部分对象了。

通过深串行化克隆对象:
    先串行化,在内存流上使用二进制深度复制;然后再找到流的开头,进行反串行化

         public   object  Clone( object  source)
        
{
            MemoryStream stream 
= new MemoryStream();
            BinaryFormatter formatter 
= new BinaryFormatter();
            formatter.Context 
= new StreamingContext(StreamingContextStates.Clone);
            formatter.Serialize(stream, source);
            stream.Position 
= 0;
            
return formatter.Deserialize(stream);
        }

 

3, 3.1 从可串行化的类中定制XML串行化
    1.格式化XML文档元素

    [XmlRoot(ElementName  =   " Pupil " , Namespace  =   " urn:MyNamespace " )]
    
public   class  Student
    
{
        
//则生成XML文档中,根元素<Pupil xmlns="urn:MyNamespace">
    }

    
    2.格式化XML元素

        [XmlElement(ElementName  =   " FullName " , Namespace  =   " urn:OtherNamespace " )]
        
public   string  Name
        
{
            
get return name; }
            
set { name = value; }
        }

    
        生成XML如下:

<? xml version = " 1.0 "  encoding = " utf-8 " ?>
< Pupil xmlns:xsd = " http://www.w3.org/2001/XMLSchema "  
       xmlns:d1p1
= " urn:OtherNamespace "   >
  
< d1p1:FullName > Thomas Smith </ d1p1:FullName >     
</ Pupil >

        这里的d1p1是自动生成的,在标题4,有办法自己指定Namespace前缀。
         
    3.格式化XML属性

        [XmlAttribute(AttributeName = " StudentNumber " , Namespace = " urn:MyNamespace " )]
        
public   string  Name
        
{
            
get return name; }
            
set { name = value; }
        }


        同样还是Name属性,这次是使用XmlAttribute标签,生成XML如下:

<? xml version = " 1.0 "  encoding = " utf-8 " ?>
< Pupil xmlns:xsd = " http://www.w3.org/2001/XMLSchema "  
       xmlns:d1p1
= " urn:OtherNamespace "  
       d1p1:Name
= " Thomas Smith " >
</ Pupil >

        XML属性在空间利用率上比XML元素略高一些。
        
    4.为元素/属性设计限定的命名空间
        使用XmlSerializer的Serialize方法重载,额外带一个XmlSerializerNamespace参数,指定这个命名空间前缀

         public   void  SerializeIt( string  filename)
        
{
            
//自定义命名空间
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add(
"xsd""http://www.w3.org/2001/XMLSchema");
            ns.Add(
"xsi""http://www.w3.org/2001/XMLSchema-instance");
            ns.Add(
"otherNS""urn:OtherNamespace");

            XmlSerializer serializer 
= new XmlSerializer(typeof(Book));
            StreamWriter writer 
= new StreamWriter(filename);
            Book myBook 
= new Book();

            
//使用Serialize重载方法
            serializer.Serialize(writer, myBook, ns);
            writer.Close();
        }


        从而生成完全自定义的XML:

<? xml version = " 1.0 "  encoding = " utf-8 " ?>
< Pupil xmlns:xsd = " http://www.w3.org/2001/XMLSchema "  
       xmlns:otherNS
= " urn:OtherNamespace "  
        xmlns:xsi
= " http://www.w3.org/2001/XMLSchema-instance "  
        otherNS:StudentNumber
= " 8007 "  xmlns = " urn:MyNamespace " >
    
< otherNS:FullName > Thomas Smith </ otherNS:FullName >
</ Pupil >

   
    5.格式化文本内容        

        [XmlText()]
        
public   string  Name
        
{
            
get return name; }
            
set { name = value; }
        }


        则Name会生成在<Pupil>XXX(Name)</Pupil>中作为文本

    6.为元素/属性定义数据类型
        XML Schema类型与.NET数据类型有一个Mapping,比如说type对应System.DateTime

        [XmlElement(DataType = " date " )]
        
public  DateTime EnrollDate
        
{
            
get return enrollDate; }
            
set { enrollDate = value; }
        }


        于是生成XML: <EnrollDate>2007-10-19</EnrollDate>
        XMLRoot,XmlAttribute,XMLElement,XMLText,XMLArrayItem标签都可以指定DataType

    7.为枚举修饰符指定其他名称

         public   enum  Color
        

            [XmlEnum(Name
="White Color")]
            White,
            [XmlEnum(Name 
= "Black Color")]
            Black,
            [XmlEnum(Name 
= "Red Color")]
            Red
        }


        
private  Color showColor;

        
public  Color ShowColor
        
{
            
get return showColor; }
            
set { showColor = value; }
        }


生成XML如下格式:
    <ShowColor>White Color</ShowColor>

    8.串行化多肽数组

        [XmlArray(ElementName = " Cources " ),
        XmlArrayItem(Type
= typeof (String), ElementName = " CourceName " ),
        XmlArrayItem(Type
= typeof (Int32), ElementName = " CourceCode " )]
        
public  Object[] Subjects
        
{
            
get return subjects; }
            
set { subjects = value; }
        }

XmlArrayItem负责指定数组中可能出现的元素类型,以及该类型对应的XML前缀
比如说创建如下的数组:
    Object obj = new Object["Physics", 123, "IT"];

生成XML如下格式:

< Cources >
    
< CourceName > Physics </ CourceName >
    
< CourceCode > 123 </ CourceCode >
    
< CourceName > IT </ CourceName >
</ Cources >


    9.定义可空的对象引用
        如果某属性为null,在串行化时会忽略该属性,可以显示替代的信息,方法如下:

        [XmlElement(IsNullable  =   true )]
        
public   string  Address
        
{
            
get return address; }
            
set { address = value; }
        }

在该位置,生成替代XML:
     <Address xsi:nil="true" />

    10.定义可忽略的字段/属性
        [XmlIgnore()]

3.2 把XML串行化定制为SOAP编码格式

         public   void  MySerialize(Student obj,  string  filename)
        
{
            SoapReflectionImporter importer 
= new SoapReflectionImporter();
            XmlTypeMapping mapping 
= importer.ImportMembersMapping(typeof(Student));

            XmlTextWriter writer 
= new XmlTextWriter(filename, System.Text.Encoding.UTF8);
            writer.WriteStartElement(
"MyWrapperElement");
            writer.WriteAttributeString(
"xmlns""xsd", Nothing, "http://www.w3.org/2001/XMLSchema");
            writer.WriteAttributeString(
"xmlns""xsi", Nothing, "http://www.w3.org/2001/XMLSchema-instance");
            writer.WriteAttributeString(
"xmlns""soap", Nothing, "http://schemas.xmlsoap.org/soap/encoding/");
            writer.WriteAttributeString(
"xmlns""otherNS", Nothing, "urn:OtherNamespace");

            XmlSerializer serializer 
= new XmlSerializer(mapping);
            serializer.Serialize(writer, obj);
            writer.WriteEndElement();
            writer.Close();
        }

于是,生产SOAP格式的XML文件。

Soap编码串行化的属性,无XMLText和XMLArray,其它的对应如下:

SoapTypeXmlType
SoapElementXmlElement
SoapAttributeXmlAttribute
SoapEnumXmlEnum
SoapIgnoreXmlIgnore
SoapIncludeXmlInclude

这篇关于.NET XML 串行化讲座的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/607706

相关文章

SpringBoot中配置文件pom.xml的使用详解

《SpringBoot中配置文件pom.xml的使用详解》SpringBoot的pom.xml文件是Maven项目的核心配置文件,用于定义项目的依赖、插件、构建配置等信息,下面小编就来和大家详细介绍一... 目录1. 基本结构2. 关键部分详解2.1 <modelVersion>2.2 项目坐标2.3 <p

Java实现XML与JSON的互相转换详解

《Java实现XML与JSON的互相转换详解》这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. XML转jsON1.1 代码目的1.2 代码实现2. JSON转XML3. JSON转XML并输出成指定的

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用