序列化ArcEngine对象

一、使用背景

在 编写ArcObjects多线程程序时,不提倡传递AO的对象,要求进程间传递的参数类型必须是简单类型或者托管类型,如果我们必须要一个工作线程传递一 个AO的对象,例如Geometry对象,IPropertySet对象,IRecordSet对象等等,这时就必须将这些对象序列化成一个字符串作为参 数传递给工作线程

二、主要接口及其介绍

在esriSystem类库中,提供了序列化和反序列化AO对象的接口,常有的接口:IXMLStream,IXMLWriter,IXMLReader,IXMLSerializer,IXMLFlags等等如下图所示

clip_image002

1.IXMLStream: 用来保存和读取XML流,从IStream继承

clip_image003

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;

}

 
http://gaojuncq123.spaces.live.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值