Source Generator for Lagrange.Proto
$ dotnet add package Lagrange.Proto.Generatorusing System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Lagrange.Proto;
public class Person
{
[ProtoMember(1)] public string Name { get; set; }
[ProtoMember(2)] public int Age { get; set; }
[ProtoMember(3)] public List<string> Hobbies { get; set; }
}
After defining the class, you can serialize and deserialize it using the ProtoSerializer class.
var result = ProtoSerializer.Serialize(new Person
{
Name = "John Doe",
Age = 30,
Hobbies = new List<string> { "Reading", "Traveling" }
});
Console.WriteLine($"Serialized: {BitConverter.ToString(resutl)}");
var person = ProtoSerializer.Deserialize<Person>(result.AsSpan());
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
Console.WriteLine($"Hobbies: {string.Join(", ", person.Hobbies)}");
For AOT-friendly code generation, you can use the ProtoPackable attribute to mark your classes. The source generator will generate the necessary serialization and type info methods at compile time.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Lagrange.Proto;
[ProtoPackable]
public class Person
{
[ProtoMember(1)] public string Name { get; set; }
[ProtoMember(2)] public int Age { get; set; }
[ProtoMember(3)] public List<string> Hobbies { get; set; }
}
var result = ProtoSerializer.SerializeProtoPackable(new Person
{
Name = "John Doe",
Age = 30,
Hobbies = new List<string> { "Reading", "Traveling" }
});
Console.WriteLine($"Serialized: {BitConverter.ToString(resutl)}");
var person = ProtoSerializer.DeserializeProtoPackable<Person>(result.AsSpan());
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
Console.WriteLine($"Hobbies: {string.Join(", ", person.Hobbies)}");
ProtoValueMember [ProtoMember(1)] [ProtoValueMember(NumberHandling = NumberHandling.Signed)]
public Dictionary<string, int> MapField { get; set; } = new();