让类自己决定如何进行XML序列化

我们自己定义的类,进行XML序列化时,一般不需要额外的说明;如何自定这个过程呢,让类自己来管理这个序列化过程呢?找了大半天,没能得到一点源代码提示。

XML序列化没想到也分二种,一种就叫XML序列化吧,一种是SOAP序列化。

我指的XML序列化被序列化的类,一般不需要额外代码。
None.gif // 序列化            
None.gif
TextWriter writer  =   null ;
None.gif
try
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    XmlSerializer ser 
= new XmlSerializer(typeof(NHFrogGenerator.MemberProperty));
InBlock.gif    writer 
= new StreamWriter("d:\\temp\\myFileName.xml");
InBlock.gif    ser.Serialize(writer, pro);
ExpandedBlockEnd.gif}

None.gif
catch (Exception ee)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    MessageBox.Show(ee.ToString());
ExpandedBlockEnd.gif}

None.gif
finally
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if(writer!=null)
InBlock.gif        writer.Close();
ExpandedBlockEnd.gif}

None.gif
None.gif

SOAP序列化,需要添加类的属性为Serializable。其实序列化的过程与XML的差不多
None.gif // 序列化            
None.gif
Stream writer  =   null ;
None.gif
try
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    SoapFormatter formatter 
= new SoapFormatter();
InBlock.gif    writer 
= File.OpenWrite("d:\\temp\\myFileName.xml");
InBlock.gif    formatter.Serialize(writer,pro);
ExpandedBlockEnd.gif}

None.gif
catch (Exception ee)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    MessageBox.Show(ee.ToString());
ExpandedBlockEnd.gif}

None.gif
finally
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if(writer!=null)
InBlock.gif        writer.Close();
ExpandedBlockEnd.gif}

None.gif

两者的命名空间不同
XML是System.Xml.Serialization
SOAP是 System.Runtime.Serialization.Formatters.Soap

我以为ISerializable可以帮助我自定义这个XML序列化过程,放个断点,发现没被执行,于是使用SOAP测试。呵呵,ISerializable是SOAP使用的。好不容易找到了另一个接口IXmlSerializable.
这三个方法不知所以然
None.gif public   void  WriteXml(System.Xml.XmlWriter writer)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO:  添加 MemberProperty.WriteXml 实现
ExpandedBlockEnd.gif
}

None.gif
None.gif
public  System.Xml.Schema.XmlSchema GetSchema()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO:  添加 MemberProperty.GetSchema 实现
InBlock.gif
    return null;
ExpandedBlockEnd.gif}

None.gif
None.gif
public   void  ReadXml(System.Xml.XmlReader reader)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO:  添加 MemberProperty.ReadXml 实现
ExpandedBlockEnd.gif
}

None.gif

文档没能提供任何帮助“该成员支持 .NET Framework 结构,因此不适用于直接从代码中使用。”。WriteXml以为需要writeStart,再writeEnd,可以老出错。提示XML文档格式错。试了几遍,原来只需直接
writer.WriteElementString("ColumnName",this.ColumnName);
就OK了。

ReadXml可让我走了不少弯路。reader对应的是整个XML文档,而XmlReader是一个只读只前的对象。某个类读多又或是读少了都会影响后续的反序列化。以下是我的写法。基本测试通过!

None.gif public   void  WriteXml(System.Xml.XmlWriter writer)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {    
InBlock.gif    writer.WriteElementString(
"ColumnName",this.ColumnName);
InBlock.gif    writer.WriteElementString(
"ColumnType",string.Format("{0},NHFrogGenerator.TypeList",this.ColumnType));
InBlock.gif    writer.WriteElementString(
"Length",this.Length.ToString());
InBlock.gif    
if(this.IsPrimaryKey)
InBlock.gif        writer.WriteElementString(
"PrimaryKey","true");
ExpandedBlockEnd.gif}

None.gif
None.gif
public  System.Xml.Schema.XmlSchema GetSchema()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO:  添加 MemberProperty.GetSchema 实现
InBlock.gif
    return null;
ExpandedBlockEnd.gif}

None.gif
None.gif
public   void  ReadXml(System.Xml.XmlReader reader)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO:  添加 MemberProperty.ReadXml 实现
InBlock.gif
    bool blRun = true;
InBlock.gif    
while(blRun)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
switch(reader.LocalName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
case "ColumnType":
InBlock.gif                
string strType = reader.ReadElementString();
InBlock.gif                
break;
InBlock.gif            
case "ColumnName":
InBlock.gif                
this.ColumnName = reader.ReadElementString();                    
InBlock.gif                
break;
InBlock.gif            
case "Length":
InBlock.gif                
string iLen = reader.ReadElementString();
InBlock.gif                
break;
InBlock.gif            
case "PrimaryKey":
InBlock.gif                
string strKey = reader.ReadElementString();
InBlock.gif                
break;
InBlock.gif            
default:
InBlock.gif                blRun 
= reader.Read();
InBlock.gif                
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if(reader.NodeType == XmlNodeType.EndElement)//已到节点结尾
ExpandedSubBlockStart.gifContractedSubBlock.gif
        dot.gif{
InBlock.gif            reader.ReadEndElement();
//必须要ReadEndElement一次!!
InBlock.gif
            blRun = false;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }
            
ExpandedBlockEnd.gif}

None.gif

好了,所有技术难点都一一攻关了,可以放开手....哈哈哈,开心中...

转载于:https://www.cnblogs.com/kevin-Y/archive/2006/03/10/346834.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值