C# 使用XML序列化对象(二)

摘要:
在C#使用XML序列化对象(一)中描述了使用XML序列化对象的最简单的实现。现在我们来看看稍微复杂一点的情况:现有两个类:A和B,B是A的派生类,如下所示:publicclassA{publicinta{get;set;}}publicclassB:A{publicintb{get;set;}}如果使用C#使用XML序列化对象(一)中的方法来直接序列化类B的实例,会抛下面的异常:"不应是类型B。使用XmlInclude或SoapInclude特性静态指定非已知的类型。˃12当然,你也可以通过基类来序列化派生类,如下:AobjA=newB{a=1,b=2};stringxml=XmlSerialize;varobj=XmlDeserialize;这种方式输出的XML如下所示:˂?

C# 使用XML序列化对象(一)中描述了使用XML序列化对象的最简单的实现。

现在我们来看看稍微复杂一点的情况:

现有两个类:A和B,B是A的派生类,如下所示:

    public classA
    {
        public inta
        {
            get;
            set;
        }
    }

    public classB : A
    {
        public intb
        {
            get;
            set;
        }
    }

如果使用C# 使用XML序列化对象(一)中的方法来直接序列化类B的实例,会抛下面的异常:

"不应是类型 B。使用 XmlInclude 或 SoapInclude 特性静态指定非已知的类型。"

解决办法一:

在类A上使用XmlInclude特性标记类B,如下所示:

    [XmlInclude(typeof(B))]
    public classA
    {
        public inta
        {
            get;
            set;
        }
    }

    public classB : A
    {
        public intb
        {
            get;
            set;
        }
    }

再使用如下代码序列化类B的实例:

B objB = newB
    {
        a = 1,
        b = 2};

    string xml =XmlSerialize(objB);

    var obj = XmlDeserialize<B>(txt.Text);

输出的XML如下所示:

<?xml version="1.0" encoding="utf-16"?>
<B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <a>1</a>
  <b>2</b>
</B>

当然,你也可以通过基类来序列化派生类,如下:

A objA = new B
    {
        a = 1,
        b = 2
    };

    string xml = XmlSerialize(objA);

    var obj = XmlDeserialize<A>(txt.Text);

这种方式输出的XML如下所示:

<?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"xsi:type="B">
  <a>1</a>
  <b>2</b>
</A>

我们可以看到这里输出的XML里的标签名称是基类的名称,但是在属性中使用xsi:type="B"指定了对象的类型是派生类B。

还有另外一种方式可以不用在基类A上使用XmlInclude特性标记派生类B,如下:

    public classA
    {
        public inta
        {
            get;
            set;
        }
    }

    public classB : A
    {
        public intb
        {
            get;
            set;
        }
    }

    A objA = newB
    {
        a = 1,
        b = 2};

    string xml = null;
    XmlSerializer xs = new XmlSerializer(typeof(A), new Type[] { typeof(B) });

    using (TextWriter tw = newStringWriter())
    {
        xs.Serialize(tw, objA);
        xml =tw.ToString();
    }

    object obj = null;

    using (TextReader tr = newStringReader(xml))
    {
        obj =xs.Deserialize(tr);
    }

免责声明:文章转载自《C# 使用XML序列化对象(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springsecurity 资源服务器PHP使用header方式实现文件下载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CDATA(不应由XML解析器进行解析的文本数据)、CDATA的使用场景

1.1. CDATA: CDATA(Unparsed Character Data)指的是不应由XML解析器进行解析的文本数据。 因为XML解析器会将“<”(新元素的开始)和“&”(字符实体的开始)解析成具有特殊含义的字符,所以如果在文本中需要使用这些字符时,就必须使用实例引用去代替。但是有些文本,如JavaScript代码中会包含大量的“...

关于Spring IOC (DI-依赖注入)需要知道的一切

关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 《Spring入门经典》这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初学者也适合spring有过开发经...

java中为什么要实现序列化,什么时候实现序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implement...

kie-api介绍和使用

参考:KIE kie在drools jbpm uberfire里广泛被使用,下面对kie-api中的几个重要组件做下简单介绍 maven依赖 <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId>...

andeoid学习笔记七

Android中Broadcast的Intent大全 Api Level 3:(SDK 1.5) Xml代码 android.bluetooth.a2dp.intent.action.SINK_STATE_CHANGED android.bluetooth.intent.action.BLUETOOTH_STATE_CHANGED android.b...

spring+springmvc+mybatis xml配置文件

一、jdbc.properties 文件: driver=com.mysql.jdbc.Driverurl=jdbc:mysql://192.168.31.xxx:3306/abc?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername=xxxpassword=xxx#定义初...