2009-12-08 3 views
2

BinaryFormatter ведет себя странно в моем коде. У меня есть код, как следующиеКак бинарныйформат сериализует объекты?

[Serializable] 
public class LogEntry 
{   
    private int id; 

    private List<object> data = new List<object>(); 

    public int Id 
    { 
     get { return id; } 
    } 

    public IList<object> Data 
    { 
     get { return data.AsReadOnly(); } 
    } 
    ... 
} 
.... 
.... 
private static readonly BinaryFormatter logSerializer = new BinaryFormatter(); 
.... 
.... 
public void SerializeLog(IList<LogEntry> logEntries) 
{ 
     using (MemoryStream serializationStream = new MemoryStream()) 
     { 
      logSerializer.Serialize(serializationStream, logEntries); 
      this.binarySerializedLog = serializationStream.GetBuffer(); 
     } 
} 

В некоторой машине (32 или 64 бит в машине), она сериализация в двоичном формате - который, как ожидается. Но в некоторых машинах (все они 64-битные машины, а не для отладочных сборников) он не сериализуется, binarySerializedLog показывает ToString() значение всего отдельного Data, имя класса (...LogEntry) и значение id. Мой вопрос: есть ли конкретная причина такого поведения или я ошибаюсь? Заранее спасибо.

ответ

0

Ваш вопрос не очень понятно (вы можете определить «не сериализации»?), Но некоторые мысли:

Вы должны действительно использовать ToArray() захватить буфер, а не GetBuffer() (который является дешевле, но возвращает массив негабаритных элементов и должен использоваться только в сочетании с Length).

Где вы видите это .ToString()? BinaryFormatter записывает тип объектов, затем использует отражение для записи полей (для [Serializable]) или использует сериализацию клиента (для ISerializable). Он никогда не вызывает .ToString() (если это не то, что делает ваш ISerializable). Тем не менее, строки и т. Д. будет быть на выходе «как есть».

Обратите внимание, что BinaryFormatter может быть хрупким между версиями, поэтому будьте осторожны, если вы сохраняете эти данные в течение какого-либо времени (в целом это нормально для транспортировки, при условии, что вы обновляете оба конца в одно и то же время). Если вы заранее знаете, что такое ваши объекты .Data, существует ряд сериализаторов на основе контрактов, которые могут обеспечить большую стабильность. Я могу предоставить более конкретную помощь, если вы считаете, что это стоит исследовать.

+0

После сериализации в двоичном формате это должно выглядеть так: AAEAAAD ///// AQAAAAAAAAAMAgAAAHlNaWNyb3NvZnQ .... AAAAAAA == - Вместо этого он показывает что-то вроде: ExecutionResponse'1 [Response2] LogEntry2 - где ExecutionResponse'1 [Response2] находится в .Data (в данном конкретном случае Data содержит один элемент типа ExecutionResponse, который имеет список объектов Response2 (здесь единственный объект Response2 в списке), LogEntry - это текущее имя класса nad 2 - это идентификатор. – malay

+0

Well , последнее в целом - то, что я ожидаю - это * выглядит * как метаданные типа, которые идут перед необработанными данными, а затем поля ... Я не уверен, что это неправильно (пока). –

+0

Но во втором если не все данные присутствуют в сериализованном журнале, правильно? Я имею в виду, что невозможно будет дезацинировать из второго журнала (т.е. в ExecutionResponse'1 [Response2] LogEntry2). onse2 присутствует там, хотя Response2 сериализуем. – malay

Смежные вопросы