Любые классы или структуры с публичными свойствами
Примеры использования:
1. Примитивные типы и строки
// Отправка
var message = Message.Create()
.Data(42) // int
.Data("Hello World") // string
.Data(3.14) // double
.Build();
// Получение
int number = message.GetData<int>();
string text = message.GetData<string>();
double pi = message.GetData<double>();
2. Дата и время
// Отправка
var message = Message.Create()
.Data(DateTime.Now)
.Data(TimeSpan.FromMinutes(30))
.Data(Guid.NewGuid())
.Build();
// Получение
DateTime time = message.GetData<DateTime>();
TimeSpan duration = message.GetData<TimeSpan>();
Guid id = message.GetData<Guid>();
3. Перечисления
public enum Status { Active, Inactive }
// Отправка
var message = Message.Create()
.Data(Status.Active)
.Build();
// Получение
Status status = message.GetData<Status>();
4. Nullable-типы
// Отправка
var message = Message.Create()
.Data<int?>(null)
.Data<DateTime?>(DateTime.Now)
.Build();
// Получение
int? value = message.GetData<int?>();
DateTime? time = message.GetData<DateTime?>();
// Отправка кортежа
var message = Message.Create()
.Data((42, "answer"))
.Build();
// Получение кортежа
var (number, text) = message.GetData<(int, string)>();
8. Пользовательские объекты
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public List<string> Emails { get; set; }
}
// Отправка
var user = new User
{
Id = 1,
Name = "Alice",
Emails = new List<string> { "alice@example.com", "alice@work.com" }
};
var message = Message.Create()
.Data(user)
.Build();
// Получение
User receivedUser = message.GetData<User>();
9. Вложенные объекты
public class Order
{
public int Id { get; set; }
public User Customer { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
// Отправка
var order = new Order
{
Id = 1001,
Customer = new User { Id = 1, Name = "Bob" },
Products = new List<Product>
{
new Product { Id = 101, Name = "Book" },
new Product { Id = 102, Name = "Pen" }
}
};
var message = Message.Create()
.Data(order)
.Build();
// Получение
Order receivedOrder = message.GetData<Order>();
10. Сложные коллекции
// Отправка словаря со списками
var data = new Dictionary<string, List<Point>>
{
{ "line1", new List<Point> { new Point(1,1), new Point(2,2) } },
{ "line2", new List<Point> { new Point(3,3), new Point(4,4) } }
};
var message = Message.Create()
.Data(data)
.Build();
// Получение
var receivedData = message.GetData<Dictionary<string, List<Point>>>();
Особенности работы:
Порядок свойств:
Свойства сериализуются в алфавитном порядке
Кортежи сериализуются по порядку полей
Обработка null:
Строки: null длина -1
Ссылочные типы: записывается флаг наличия значения
Nullable<T>: отдельный флаг
Ограничения:
Приватные поля не поддерживаются
Циклические ссылки не обрабатываются
Интерфейсы требуют явного указания типа при десериализации