Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1035895
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-06-23 16:18:45

 

3.1 从可串行化的类中定制XML串行化
    1.格式化XML文档元素
    [XmlRoot(ElementName = "Pupil", Namespace = "urn:MyNamespace")]
    
public class Student
    
{
        
//则生成XML文档中,根元素
    }
    
    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="" 
       xmlns:d1p1
="urn:OtherNamespace" >
  
<d1p1:FullName>Thomas Smithd1p1: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="" 
       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""");
            ns.Add(
"xsi""-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="" 
       xmlns:otherNS
="urn:OtherNamespace" 
        xmlns:xsi
="-instance" 
        otherNS:StudentNumber
="8007" xmlns="urn:MyNamespace">
    
<otherNS:FullName>Thomas SmithotherNS:FullName>
Pupil>
   
    5.格式化文本内容        
        [XmlText()]
        
public string Name
        
{
            
get return name; }
            
set { name = value; }
        }

        则Name会生成在XXX(Name)中作为文本

    6.为元素/属性定义数据类型
        XML Schema类型与.NET数据类型有一个Mapping,比如说type对应System.DateTime
        [XmlElement(DataType="date")]
        
public DateTime EnrollDate
        
{
            
get return enrollDate; }
            
set { enrollDate = value; }
        }

        于是生成XML: 2007-10-19
        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如下格式:
    White Color

    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>PhysicsCourceName>
    
<CourceCode>123CourceCode>
    
<CourceName>ITCourceName>
Cources>

    9.定义可空的对象引用
        如果某属性为null,在串行化时会忽略该属性,可以显示替代的信息,方法如下:
        [XmlElement(IsNullable = true)]
        
public string Address
        
{
            
get return address; }
            
set { address = value; }
        }

在该位置,生成替代XML:
     



    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, "");
            writer.WriteAttributeString(
"xmlns""xsi", Nothing, "-instance");
            writer.WriteAttributeString(
"xmlns""soap", Nothing, "");
            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,其它的对应如下:

SoapType XmlType
SoapElement XmlElement
SoapAttribute XmlAttribute
SoapEnum XmlEnum
SoapIgnore XmlIgnore
SoapInclude XmlInclude

阅读(850) | 评论(0) | 转发(0) |
0

上一篇:BackgroundWorker 控件

下一篇:WCF服务

给主人留下些什么吧!~~