一、使用背景
在 编写ArcObjects多线程程序时,不提倡传递AO的对象,要求进程间传递的参数类型必须是简单类型或者托管类型,如果我们必须要一个工作线程传递一 个AO的对象,例如Geometry对象,IPropertySet对象,IRecordSet对象等等,这时就必须将这些对象序列化成一个字符串作为参 数传递给工作线程
二、主要接口及其介绍
在esriSystem类库中,提供了序列化和反序列化AO对象的接口,常有的接口:IXMLStream,IXMLWriter,IXMLReader,IXMLSerializer,IXMLFlags等等如下图所示
1.IXMLStream: 用来保存和读取XML流,从IStream继承
2.IXMLSerializer:序列化和反序列化AO对象
3.IXMLWriter和IXMLReader的详细介绍请看帮助
三、例子
1.序列化和反序列化Geometry对象
public void TestSrializePoint()
{
IPoint pPoint = new PointClass();
pPoint.X = 10;
pPoint.Y = 10;
IXMLStream pStream = new XMLStreamClass();
IXMLWriter pWriter = new XMLWriterClass();
pWriter.WriteTo((IStream) pStream);
IXMLSerializer pSerializer = new XMLSerializerClass();
pSerializer.WriteObject(pWriter, null, null, "", "", pPoint);
pStream.SaveToFile("C://Point.XML");
IXMLStream pStream2 = new XMLStreamClass();
pStream.LoadFromFile("C://Point.XML");
IXMLReader pReader = new XMLReaderClass();
pReader.ReadFrom( (IStream)pStream);
IXMLSerializer pSerializer2 = new XMLSerializerClass();
IPoint point = (IPoint)pSerializer2.ReadObject(pReader, null, null);
MessageBox.Show(point.SpatialReference.Name);
}
2.序列化和反序列化IRecordset对象
/// <summary>
/// 将一个FeatureClass中指定范围的Recordset序列化成XML文档
/// </summary>
/// <param name="featureClass"></param>
public void WriteXMLToDisk(IFeatureClass featureClass)
{
string ss= "http://www.esri.com/schemas/ArcGIS/9.0"; ;
IPropertySet pPropset = new PropertySetClass();
pPropset.SetProperty( "Namespaceuri", "http://schemas.esri.com/ArcGis/Server/");
IPropertySet pCpropset = new PropertySetClass();
pCpropset.SetProperty("http://schemas.esri.com/ArcGis/Server/", "xmlns");
pPropset.SetProperty ("Namespaceprefixes", pCpropset);
//IFeatureClass featureClass=featureLayer.FeatureClass;
IRecordSetInit recordSetInit=new RecordSetClass();
IRecordSet recordSet;
IQueryFilter queryFilter = new QueryFilterClass();
//queryFilter.SubFields = "Shape";
queryFilter.WhereClause = "FID=22";
recordSetInit.SetSourceTable((ITable)featureClass, queryFilter);
recordSet = (IRecordSet)recordSetInit;
IXMLStream xmlStream = new XMLStreamClass();
IXMLWriter xmlWriter = new XMLWriterClass();
xmlWriter.WriteTo((IStream)xmlStream);
IXMLSerializer XmlSerializer = new XMLSerializerClass();
try
{
XmlSerializer.WriteObject(xmlWriter, pPropset, null, "Record", ss, recordSet);
xmlStream.SaveToFile("C://Record.xml");
}
catch (System.Runtime.InteropServices.COMException ex)
{
throw new ArgumentException(ex.Message);
}
finally
{
GC.Collect();
}
}
/// <summary>
/// 将序列化的IRecodset文本反序列化成一个IRecordset对象
/// </summary>
/// <param name="strXmlPath"></param>
/// <returns></returns>
public IRecordSet ReadXmlFromDisk(string strXmlPath)
{
IXMLStream XmlStream = new XMLStreamClass();
XmlStream.LoadFromFile(strXmlPath);
IXMLReader XmlReader = new XMLReaderClass();
XmlReader.ReadFrom((IStream)XmlStream);
IXMLSerializer XmlSerializer = new XMLSerializerClass();
IRecordSet recordSet = (IRecordSet)XmlSerializer.ReadObject(XmlReader, null, null);
return recordSet;
}