AE中提供了IPersistStream接口進行AE對象的序列化,所有繼承了IPersistStream接口的AE對象都可以使用IPersistStream進行對象的序列化。它的使用方法如下:
void SerializeArcGisObject(object gisObj)
{
//轉換成IPersistStream對象
ESRI.ArcGIS.esriSystem.IPersistStream ps = gisObj as ESRI.ArcGIS.esriSystem.IPersistStream;
//如果是繼承了IPersistStream接口,則序列化
if (ps != null)
{
//定義一種流對象;這裡使用了MemoryBlobStreamClass
ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass mbsc = new ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass();
//把對象儲存到流中
ps.Save(mbsc, 0);
//儲存成檔案
mbsc.SaveToFile(tempFileName);
}
}
使用這個序列化時需要注意,有時在ps.Save(mbsc, 0)時會提示無限循環的錯誤,這時需要檢查序列化對象是否存在嵌套的成員(類A包含類B成員,而B有包含了A的對象),例如AE的比例尺元素的對象,在該對象中是存有目前的地圖對象,而地圖對象又有比例尺元素的這個對象,是以一般會提示錯誤。這時在序列化對象時,需要把序列化對象的這種成員的值去掉,再進行序列化。例如上面的比例尺對象,把比例尺的Map成員賦成null,再進行序列化(注意:一般要先拷貝對象後,再把成員賦成null值,否則可能出現記憶體通路錯誤,使用IObjectCopy進行拷貝)。
上面說的是序列化,那麼在序列化完成後,反序列化也就必不可少了。
object DeserializeArcGisObject(string filename,Guid guid)
{
//定義一種流對象;這裡使用了MemoryBlobStreamClass
//使用流讀取檔案
ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass mbsc = new ESRI.ArcGIS.esriSystem.MemoryBlobStreamClass();
//使用流讀取檔案
mbsc.LoadFromFile(filename);
//執行個體化對象,這裡需要知道這個檔案存的是那個對象,可以
//這裡使用COM的Guid來标示(起始可以自己定義一種檔案,檔案頭存Guid)
//使用COM的Guid擷取Com類型
Type comType = Type.GetTypeFromCLSID(guid, false);
//通過Type執行個體化對象
ESRI.ArcGIS.esriSystem.IPersistStream ips = (ESRI.ArcGIS.esriSystem.IPersistStream)Activator.CreateInstance(comType);
ips.Load(objStream);
return ips;
}
使用這個方式反序列化時,如果想把反序列的對象轉換成實體類(Guid一樣的)的對象,是無法進行轉換的,隻能轉換成對應的接口。如果想轉換的話,可以使用記憶體拷貝的方式進行轉換。有關記憶體拷貝可以參考IObjectCopy的方法。