C# C中ResultBuffer的二进制序列化#
我有一个可以工作的XML序列化程序,它可以在AutoCAD中将C#对象序列化为实体。我希望能够做同样的事情,但是对于XML不起作用的情况,使用二进制序列化。到目前为止,我的序列化方法如下所示:C# C中ResultBuffer的二进制序列化#,c#,serialization,autocad,binary-serialization,C#,Serialization,Autocad,Binary Serialization,我有一个可以工作的XML序列化程序,它可以在AutoCAD中将C#对象序列化为实体。我希望能够做同样的事情,但是对于XML不起作用的情况,使用二进制序列化。到目前为止,我的序列化方法如下所示: public static void BinarySave(Entity entityToWriteTo, Object objToSerialize, string key = "default") { using (MemoryStream stream = new MemoryStream(
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序列化程序,只是我不知道如何将序列化对象放入resultbuffer中,以添加到entityToWriteTo的Xrecord中 如果由于某种原因XML不适合您,我建议尝试不同的文本数据格式,如JSON。免费的开源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);
}
}
}
公共静态类BinaryFormatterHelper
{
公共静态字符串ToBase64String(T obj)
{
使用(var stream=new MemoryStream())
{
新的BinaryFormatter().Serialize(流,obj);
返回Convert.ToBase64String(stream.GetBuffer(),0,checked((int)stream.Length));//溢出时引发异常。
}
}
公共静态T FromBase64String(字符串数据)
{
使用(var stream=newmemoryStream(Convert.FromBase64String(数据)))
{
var formatter=新的二进制格式化程序();
var obj=格式化程序。反序列化(流);
if(obj是T)
返回(T)obj;
返回默认值(T);
}
}
}
然后,结果字符串可以存储在
ResultBuffer
中,就像存储XML字符串一样。我只是想建议:我经常看到BinaryFormatter
的受害者,他们由于一些小的重构或修订无法反序列化他们的数据;当我建议人们使用BinaryFormatter
时,我想不出有多少场景。二进制序列化本身很好——有许多非常好的二进制序列化格式;我只是在说BinaryFormatter本身,我不确定它是否会工作,也许@Marc Grasser会就此打来电话。但我相信protobuf可以完成这项任务。我相信它具有序列化外部对象的功能。@Trae是的,protobuf-net将适用于许多模型,而不是所有模型。我必须看一些细节才能更详细地评论