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

C#   12 Май 2013  Автор статьи:  

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

1
2
3
4
5
6
7
8
9
10
11
[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] применим только к полям, т.е нельзя сделать несериализуемыми другие свойства в классе. Таким образом:

1
2
3
4
5
6
7
8
9
10
11
[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] можно применять только к полям      
}

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

1
2
3
4
5
6
7
public static byte[] Serialize(Stamp stamp)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();
    formatter.Serialize(stream, stamp);
    return stream.ToArray();
}

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

1
2
3
4
5
6
public static Stamp Deserialize(byte[] binaryData)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream ms = new MemoryStream(binaryData);
    return (Stamp)formatter.Deserialize(ms);
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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++