ArcEngine 内部封装对象的序列化

/// <summary>
/// ArcGIS对象序列化成二进制
/// </summary>
/// <param name="pObject"></param>
/// <returns></returns>
public static byte[] ReadObjectToBytes(object pObject)
{
    byte[] defaultBytes = null;
    if (pObject is IPersistStream)
    {
        IPersistStream persistStream = pObject as IPersistStream;
        IObjectStream pObjStream = new ObjectStreamClass();
        IMemoryBlobStream pBlobStream = new MemoryBlobStreamClass();
        pObjStream.Stream = pBlobStream;
        persistStream.Save(pObjStream, 0);

        int n = (int)pBlobStream.Size;
        defaultBytes = new byte[n];
        object obj2 = null;
        IMemoryBlobStreamVariant pBlobVariant = pBlobStream as IMemoryBlobStreamVariant;
        pBlobVariant.ExportToVariant(out obj2);
        defaultBytes = (byte[])obj2;
    }
    return defaultBytes;
}

/// <summary>
/// 二进制反序列化成ArcGIS对象
/// </summary>
/// <param name="bytes"></param>
/// <param name="pObject"></param>
public static void ReadObjectFromBytes(byte[] bytes, object pObject)
{
    if (pObject is IPersistStream)
    {
        IPersistStream pPersistStream = pObject as IPersistStream;
        IMemoryBlobStream2 pBlobStream = new MemoryBlobStreamClass();
        pBlobStream.ImportFromMemory(ref bytes[0], (uint)bytes.Length);
        IObjectStream pObjStream = new ObjectStreamClass();
        pObjStream.Stream = pBlobStream;
        pPersistStream.Load(pObjStream);
    }
}

/// <summary>
/// 读取ArcGIS BLOB类型属性到byte数组
/// </summary>
/// <param name="blobValue">字段值</param>
/// <returns></returns>
public static byte[] ReadEsriBlobToBytes(object blobValue)
{
    if (blobValue == null || blobValue == DBNull.Value)
    {
        return null;
    }

    IMemoryBlobStream2 pBlobStream = new MemoryBlobStreamClass();
    pBlobStream = (IMemoryBlobStream2)blobValue;
    int n = (int)pBlobStream.Size;
    byte[] bytes = new byte[n];
    object obj = null;
    IMemoryBlobStreamVariant pBlobVariant = pBlobStream as IMemoryBlobStreamVariant;
    pBlobVariant.ExportToVariant(out obj);
    bytes = (byte[])obj;

    return bytes;
}
/// <summary>
/// 将AE中实现了IPersistStream接口的对象序列化为二进制文件
/// </summary>
/// <param name="FilePath">如C:\file.blb</param>
/// <param name="pObject"></param>
/// <returns></returns>
public static bool WriteObj(string FilePath, object pObject)
{
    bool result = false;
    if (pObject is IPersistStream)
    {
        IPersistStream persistStream = pObject as IPersistStream;
        IObjectStream pObjStream = new ObjectStreamClass();
        IMemoryBlobStream pBlobStream = new MemoryBlobStreamClass();
        pObjStream.Stream = pBlobStream;
        persistStream.Save(pObjStream, 0);
        try
        {
            pBlobStream.SaveToFile(FilePath);
            result = true;
        }
        catch { }
    }
    return result;
}
/// <summary>
/// 序列化AE对象为字符串,在线程间传递
/// </summary>
public static string SerialsAEObject(IWorkspace pWorkspace)
{
    try
    {
        IXMLStream pStream = new XMLStreamClass();
        IXMLWriter pWriter = new XMLWriterClass();
        pWriter.WriteTo(pStream as IStream);

        IXMLSerializer pSerializer = new XMLSerializerClass();

        //pWorkspace不能序列化,会报错
        pSerializer.WriteObject(pWriter, null, null, "", "", pWorkspace.ConnectionProperties);
        return pStream.SaveToString();
    }
    catch (Exception ex)
    {
        return "";
    }
}


public static IWorkspace DeSerialsAEObject(string strObj,string PassWord)
{
    try
    {
        IXMLStream pStream = new XMLStreamClass();
        pStream.LoadFromString(strObj);
        IXMLReader pReader = new XMLReaderClass();
        pReader.ReadFrom(pStream as IStream);
        IXMLSerializer pSerializer = new XMLSerializerClass();

        IPropertySet pPropSet = pSerializer.ReadObject(pReader, null, null) as IPropertySet;
        pPropSet.SetProperty("PASSWORD",PassWord);//反序列化后密码是空,需要重新赋值,要不会弹出连接参数界面
        IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
        IWorkspace pWS = workspaceFactory.Open(pPropSet, 0);
        return pWS;
    }
    catch (Exception ex)
    {
        return null;
    }
}

posted @   F(x)_King  阅读(318)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
主题色彩