Типы данных
Поддерживаемые типы данных и примеры использования
Поддерживаемые типы данных:
Примитивные типы:
bool
,byte
,sbyte
,char
,decimal
,double
,float
,int
,uint
,long
,ulong
,short
,ushort
Специальные типы:
string
Guid
DateTime
TimeSpan
Перечисления (enum):
Любые пользовательские
enum
Nullable-типы:
int?
,bool?
,DateTime?
и т.д.
Коллекции:
Массивы:
int[]
,string[]
и т.д.List<T>
,IList<T>
,ICollection<T>
,IEnumerable<T>
HashSet<T>
,SortedSet<T>
Любые другие коллекции, реализующие
IEnumerable
Словари:
Dictionary<TKey, TValue>
,IDictionary<TKey, TValue>
,IDictionary
Кортежи (ValueTuple):
(int, string)
,ValueTuple<int, string>
(int Id, string Name)
- именованные кортежи
Пользовательские объекты (DTO):
Любые классы или структуры с публичными свойствами
Примеры использования:
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?>();
5. Массивы и списки
// Отправка массива
var message = Message.Create()
.Data(new int[] { 1, 2, 3 })
.Build();
// Получение массива
int[] array = message.GetData<int[]>();
// Отправка списка
var message2 = Message.Create()
.Data(new List<string> { "a", "b", "c" })
.Build();
// Получение списка
List<string> list = message2.GetData<List<string>>();
6. Словари
// Отправка словаря
var message = Message.Create()
.Data(new Dictionary<int, string> { { 1, "one" }, { 2, "two" } })
.Build();
// Получение словаря
Dictionary<int, string> dict = message.GetData<Dictionary<int, string>>();
7. Кортежи
// Отправка кортежа
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> { "[email protected]", "[email protected]" }
};
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>: отдельный флаг
Ограничения:
Приватные поля не поддерживаются
Циклические ссылки не обрабатываются
Интерфейсы требуют явного указания типа при десериализации
Last updated
Was this helpful?