2015-04-21 3 views
1

У меня есть рабочий XML-сериализатор, который сериализует объект C# для объекта в AutoCAD. Я хотел бы иметь возможность сделать то же самое, но с Binary Serialization для случаев, когда XML не работает. До сих пор мой метод сериализации выглядит следующим образом:Binary Serialization to ResultBuffer в C#

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 Serializer только я понятия не имею, как получить сериализированный объект в resultbuffer быть добавлены к XRecord из entityToWriteTo.

+2

Я просто собираюсь посоветовать: * регулярно * видеть жертв «BinaryFormatter» - кто из-за небольшого рефакторинга или ревизии не может десериализовать свои данные; Я не могу придумать очень много сценариев, когда я бы посоветовал людям использовать «BinaryFormatter». Двоичная сериализация * сама по себе - это хорошо - существует ряд совершенно хороших бинарных форматов сериализации; Я говорю * только * о 'самом BinaryFormatter' –

+0

Я не уверен, если бы это сработало, и, возможно, @Marc Gravel мог бы позвонить в это. Но я считаю, что protobuf может справиться с этой задачей. Я считаю, что он имеет функциональность для сериализации внешних объектов. –

+0

@Trae yep, protobuf-net будет работать для многих моделей - не все. Мне нужно будет подробнее ознакомиться с комментариями –

ответ

1

Если 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 ,