让类自己决定如何进行XML序列化
我们自己定义的类,进行XML序列化时,一般不需要额外的说明;如何自定这个过程呢,让类自己来管理这个序列化过程呢?找了大半天,没能得到一点源代码提示。
XML序列化没想到也分二种,一种就叫XML序列化吧,一种是SOAP序列化。
我指的XML序列化被序列化的类,一般不需要额外代码。
SOAP序列化,需要添加类的属性为Serializable。其实序列化的过程与XML的差不多
两者的命名空间不同
XML是System.Xml.Serialization
SOAP是System.Runtime.Serialization.Formatters.Soap
我以为ISerializable可以帮助我自定义这个XML序列化过程,放个断点,发现没被执行,于是使用SOAP测试。呵呵,ISerializable是SOAP使用的。好不容易找到了另一个接口IXmlSerializable.
这三个方法不知所以然
好了,所有技术难点都一一攻关了,可以放开手....哈哈哈,开心中...
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();
}
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();
}
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 实现
}
{
// 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;
}
}
}
{
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;
}
}
}
好了,所有技术难点都一一攻关了,可以放开手....哈哈哈,开心中...