2013-03-22 6 views
1

я попробовал (модифицированный и упрощенный) MSDN Exemple базовой сериализации в http://msdn.microsoft.com/en-us/library/4abbf6k0.aspxC#: Сериализация простого класса

//the class : 
[Serializable] 
public class MyObject { 
    public byte n1 = 0; 
    public byte n2 = 0; 
} 

//The code 
MyObject obj = new MyObject(); 
obj.n1 = 1; 
obj.n2 = 24; 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
formatter.Serialize(stream, obj); 
stream.Close();  

Итак, я ожидал найти 2 байта: 0x01 0x18 в MyFile.bin
но это не нравится, у меня есть этот результат:

enter image description here

Почему все это. и как я могу делать то, что хотел бы.

Целью данного теста является сериализация более Complexe структуру для того, чтобы сохранить их в двоичный файл

+1

'BinaryFormatter' добавить некоторые метаданные о структуре. Но даже если вы пренебрегаете им - 'int' имеет по 4 байта каждый, почему вы ожидаете увидеть 2 байта, имеющих две 4-байтовые структуры Int32? –

+0

Вы должны использовать оператор 'using' для потока, чтобы убедиться, что ресурсы очищены в случае исключения. 'Close()' недостаточно безопасен, потому что он может упасть, прежде чем он попадет в этот оператор. –

+0

Извините, я не могу исправить, прежде чем отправлять двух членов класса MyObject - это байты (но я не знаю, как отредактировать мой вопрос) – lolonapoli

ответ

0

Serializer также хранит информацию о типе об объекте, который был сериализации. Эта информация используется во время десериализации, поэтому экземпляры соответствующих классов создаются.

Я хотел бы предложить вам взглянуть на protobuf-net для двоичной сериализации. Это быстро и обрабатывает изменения в классах лучше, чем BinaryFormatter. Вероятно, это было бы безопаснее, чем изобретать собственный механизм сериализации.

+1

Хотя это верно, оно не отвечает на вопрос OPs –

+0

Отвечает «Почему там все это "часть ... –

+0

А как насчет самой однозначной части' и как я могу делать то, что мне хочется? " –

0

Сериализация объекта .Net сложна. Он также сохраняет метаданные для восстановления класса .Net, поэтому не ожидайте, что он будет выровнен в соответствии с членами класса. Это проприетарный формат, и только .Net framework может десериализовать класс.

Если вы хотите сериализовать таким образом, вы должны написать свою пользовательскую функцию сериализации, которая переопределяет значение по умолчанию и сериализует/десериализует класс самостоятельно.

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