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
提供了一些支持,包括
- Dictionaries.
- Classes lacking default constructors.
- polymorphic types.
- Complex data conversion and remapping.
此外,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 字符串一样。
我有一个可用的 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
提供了一些支持,包括
- Dictionaries.
- Classes lacking default constructors.
- polymorphic types.
- Complex data conversion and remapping.
此外,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 字符串一样。