Сериализация и десериализация в C#

C#   12 мая 2013  Автор статьи:  

В данной статье мы рассмотрим как легко можно сериализовать и десириализовать объекты в C#. Для тех, кто не знает сериализация — это процесс получения байт представления объекта для удобной его передачи или хранения. Соответственно процесс десириализации — это получение объекта из байт массива. Для сериализации я выбрал класс Stamp. Пусть мы хотим сохранить все его свойства кроме H:

[Serializable]
public class Stamp
{
public int S { get; set; }
public int X { get; set; }
public int O { get; set; }
public int N { get; set; }
public int I { get; set; }
[NonSerialized]
public byte[] h;
}

Ключевое слово [Serializable] показывает, что класс сериализуемый. [NonSerialized] применим только к полям, т.е нельзя сделать несериализуемыми другие свойства в классе. Таким образом:

[Serializable]
public class Stamp
{
public int S { get; set; }
public int X { get; set; }
public int O { get; set; }
public int N { get; set; }
public int I { get; set; }
[NonSerialized]
public byte[] H { get; set; }//ошибка [NonSerialized] можно применять только к полям
}

Теперь давайте непосредственно реализуем сериализацию:

public static byte[] Serialize(Stamp stamp)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, stamp);
return stream.ToArray();
}

Десериализация выглядит также просто:

public static Stamp Deserialize(byte[] binaryData)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream(binaryData);
return (Stamp)formatter.Deserialize(ms);
}

Проверим, что все хорошо работает:

static void Main(string[] args)
{
Stamp st = new Stamp()
{
h = new byte[100],
I = 1,
N = 5,
O = 3,
S = 2,
X = 6
};
byte[] arr = Serialize(st);
Stamp st2 = Deserialize(arr);
}

Значения в st и st2 совпадают, но в st2 h=null, что и ожидалось.

Научиться программировать

  • на Delphi

  • на Java

  • на C++