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

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

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

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

catch(Exception ee)
{
    MessageBox.Show(ee.ToString());
}

finally
{
    
if(writer!=null)
        writer.Close();
}



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

catch(Exception ee)
{
    MessageBox.Show(ee.ToString());
}

finally
{
    
if(writer!=null)
        writer.Close();
}


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

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


public System.Xml.Schema.XmlSchema GetSchema()
{
    
// TODO:  添加 MemberProperty.GetSchema 实现
    return null;
}


public void ReadXml(System.Xml.XmlReader reader)
{
    
// TODO:  添加 MemberProperty.ReadXml 实现
}

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

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

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


public System.Xml.Schema.XmlSchema GetSchema()
{
    
// TODO:  添加 MemberProperty.GetSchema 实现
    return null;
}


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

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

    }
            
}


好了,所有技术难点都一一攻关了,可以放开手....哈哈哈,开心中...
posted @ 2006-03-10 08:28  生命体验之kevin-Y  阅读(609)  评论(0编辑  收藏  举报