簡體   English   中英

在C#中對ResultBuffer進行二進制序列化

[英]Binary Serialization to ResultBuffer in C#

我有一個工作的XML序列化程序,該序列化程序將C#對象序列化為AutoCAD中的實體。 我希望能夠做同樣的事情,但是對於XML不起作用的情況,可以使用二進制序列化。 到目前為止,我的序列化方法如下所示:

public static void BinarySave(Entity entityToWriteTo, Object objToSerialize, string key = "default")
{
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter serializer = new BinaryFormatter();
        serializer.Serialize(stream, objToSerialize);
        stream.Position = 0;

        ResultBuffer data = new ResultBuffer();

        /*Code to get binary serialization into result buffer*/

        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            using (DocumentLock docLock = doc.LockDocument())
            {
                if (!entityToWriteTo.IsWriteEnabled)
                {
                    entityToWriteTo = tr.GetObject(entityToWriteTo.Id, OpenMode.ForWrite) as Entity;
                }

                if (entityToWriteTo.ExtensionDictionary == ObjectId.Null)
                {
                    entityToWriteTo.CreateExtensionDictionary();
                }

                using (DBDictionary dict = tr.GetObject(entityToWriteTo.ExtensionDictionary, OpenMode.ForWrite, false) as DBDictionary)
                {
                    Xrecord xrec;

                    if (dict.Contains(key))
                    {
                        xrec = tr.GetObject(dict.GetAt(key), OpenMode.ForWrite) as Xrecord;
                        xrec.Data = data;
                    }

                    else
                    {
                        xrec = new Xrecord();
                        xrec.Data = data;
                        dict.SetAt(key, xrec);
                        tr.AddNewlyCreatedDBObject(xrec, true);
                    }

                    xrec.Dispose();
                }

                tr.Commit();
            }

           data.Dispose();
        }
    }
}

它很大程度上基於我的XML序列化器,除了我不知道如何將序列化的對象放入要添加到entityToWriteTo的Xrecord的結果緩沖區中。

如果XML由於某種原因無法為您服務,我建議您嘗試使用其他文本數據格式,例如JSON。 免費且開源的JSON格式化程序Json.NET對可能導致XmlSerializer 崩潰的情況提供了一些支持,包括

另外,JSON可讀性強,因此您可以通過目視檢查來診斷數據中的問題。

話雖如此,您可以使用以下輔助方法將輸出流從BinaryFormatter轉換為base64字符串:

public static class BinaryFormatterHelper
{
    public static string ToBase64String<T>(T obj)
    {
        using (var stream = new MemoryStream())
        {
            new BinaryFormatter().Serialize(stream, obj);
            return Convert.ToBase64String(stream.GetBuffer(), 0, checked((int)stream.Length)); // Throw an exception on overflow.
        }
    }

    public static T FromBase64String<T>(string data)
    {
        using (var stream = new MemoryStream(Convert.FromBase64String(data)))
        {
            var formatter = new BinaryFormatter();
            var obj = formatter.Deserialize(stream);
            if (obj is T)
                return (T)obj;
            return default(T);
        }
    }
}

然后可以將結果字符串存儲在ResultBuffer就像存儲XML字符串一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM