Сериализация - это процесс преобразования объектов в формат, пригодный для хранения или передачи. В .NET существует множество протоколов сериализации, каждый со своими особенностями и сферами применения.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Сериализация
var serializer = new XmlSerializer(typeof(Person));
using var writer = new StringWriter();
serializer.Serialize(writer, new Person { Name = "John", Age = 30 });
string xml = writer.ToString();
// Десериализация
using var reader = new StringReader(xml);
var person = (Person)serializer.Deserialize(reader);
Характеристики:
Применение:
// Используя System.Text.Json
var person = new Person { Name = "John", Age = 30 };
string json = JsonSerializer.Serialize(person);
var deserialized = JsonSerializer.Deserialize<Person>(json);
// Newtonsoft.Json (популярная библиотека)
string json = JsonConvert.SerializeObject(person);
var deserialized = JsonConvert.DeserializeObject<Person>(json);
Характеристики:
Применение:
// Внимание: BinaryFormatter считается небезопасным в .NET Core 3.0+
var formatter = new BinaryFormatter();
using var stream = new MemoryStream();
formatter.Serialize(stream, person);
byte[] binaryData = stream.ToArray();
// Десериализация
stream.Position = 0;
var deserialized = (Person)formatter.Deserialize(stream);
Характеристики:
Применение:
// Использование Google.Protobuf
[ProtoContract]
public class ProtoPerson
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public int Age { get; set; }
}
var person = new ProtoPerson { Name = "John", Age = 30 };
using var stream = new MemoryStream();
Serializer.Serialize(stream, person);
byte[] protoData = stream.ToArray();
// Десериализация
stream.Position = 0;
var deserialized = Serializer.Deserialize<ProtoPerson>(stream);
Характеристики:
Применение:
// Использование MessagePack-CSharp
[MessagePackObject]
public class MsgPackPerson
{
[Key(0)]
public string Name { get; set; }
[Key(1)]
public int Age { get; set; }
}
var person = new MsgPackPerson { Name = "John", Age = 30 };
byte[] msgpackData = MessagePackSerializer.Serialize(person);
var deserialized = MessagePackSerializer.Deserialize<MsgPackPerson>(msgpackData);
Характеристики:
Применение:
// Использование Newtonsoft.Json BSON
var person = new Person { Name = "John", Age = 30 };
MemoryStream ms = new MemoryStream();
using (BsonWriter writer = new BsonWriter(ms))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, person);
}
byte[] bsonData = ms.ToArray();
// Десериализация
ms.Position = 0;
using (BsonReader reader = new BsonReader(ms))
{
JsonSerializer serializer = new JsonSerializer();
var deserialized = serializer.Deserialize<Person>(reader);
}
Характеристики:
Применение:
выбор протокола сериализации зависит от требований к производительности, размеру данных, межплатформенной совместимости и безопасности. Для современных .NET приложений чаще всего используют JSON для внешних интерфейсов и protobuf/MessagePack для внутренней высокопроизводительной коммуникации.