GenPack by dimohy
Nuget / site data
Details
Info
Name: GenPack
Packet generation and serialization/deserialization library using the .NET Source Generator
Author: dimohy
NuGet: https://www.nuget.org/packages/GenPack/
You can find more details at https://github.com/dimohy/GenPack
Source : https://github.com/dimohy/GenPack
Original Readme
GenPack
GenPack is a library that uses the .NET source generator to automatically generate packets as classes once you define a schema for the packets. It's easy to use and the results are useful.
GenPack also works well with Native AOT. You can take advantage of the benefits of Native AOT.
Simple to use
[GenPackable]
public partial record PeoplePacket
{
public readonly static PacketSchema Schema = PacketSchemaBuilder.Create()
.@short("Age", "Age description")
.@string("Name", "Name description")
.Build();
}
The following code is automatically generated by the schema information.
public partial record PeoplePacket : GenPack.IGenPackable
{
/// <summary>
/// Age description
/// </summary>
public short Age { get; set; }
/// <summary>
/// Name description
/// </summary>
public string Name { get; set; } = string.Empty;
public byte[] ToPacket()
{
using var ms = new System.IO.MemoryStream();
ToPacket(ms);
return ms.ToArray();
}
public void ToPacket(System.IO.Stream stream)
{
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
writer.Write(Age);
writer.Write(Name);
}
public static PeoplePacket FromPacket(byte[] data)
{
using var ms = new System.IO.MemoryStream(data);
return FromPacket(ms);
}
public static PeoplePacket FromPacket(System.IO.Stream stream)
{
PeoplePacket result = new PeoplePacket();
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
int size = 0;
byte[] buffer = null;
result.Age = reader.ReadInt16();
result.Name = reader.ReadString();
return result;
}
}
It's simple to use. You can binary serialize with ToPacket()
and deserialize with FromPacket()
.
var p = new PeoplePacket()
{
Age = 10,
Name = "John"
};
var data = p.ToPacket();
var newP = PeoplePacket.FromPacket(data);
Console.WriteLine(newP);
PeoplePacket { Age = 10, Name = John }
How to create a packet schema
Decorate the attribute of class
or record
with GenPackable
. At this point, the target must be given partial
.
GenPack's packet schema is represented by creating a PacketSchema
using the PacketSchemaBuilder
.
[GenPackable]
public partial record PeoplePacket
{
public readonly static PacketSchema Schema = PacketSchemaBuilder.Create()
.@short("Age", "Age description")
.@string("Name", "Name description")
.Build();
}
The format beginning with @
means the schema property to be created. For example, @short("Age", "Age description")
gives the Age
property the type short
and the description Age description
.
This translates to the following,
/// <summary>
/// Age description
/// </summary>
public short Age { get; set; }
You can then use the auto-generated properties.
var p = new PeoplePacket()
p.Age = 32;
Schema Properties
Property | Description | Bits | Arguments |
---|---|---|---|
@byte | byte | 8 | property name, description |
@sbyte | signed byte | 8 | property name, description |
@short | short int | 16 | property name, description |
@ushort | unsigned short int | 16 | property name, description |
@int | int | 32 | property name, description |
@uint | unsigned int | 32 | property name, description |
@long | long int | 64 | property name, description |
@ulong | unsigned long int | 64 | property name, description |
@float | single float | 32 | property name, description |
@double | double float | 64 | property name, description |
@string | string | N | property name, description |
@object\<type> | genpackable object | N | property name, description |
@list\<type> | variable list | N | property name, description |
@dict\<type> | variable dictionary | N | property name, description |
@array\<type> | fixed array | N | property name, size, description |
Tasks
- Support for Endian, string Encoding.
- Support for checksums.
- Support 8-bit, 16-bit, 32-bit, 64-bit, or variable 7-bit sizes for
@list
and@dict
. - Add
@ver
property to allow revision control of packets. - Automatically select and deserialize target structures based on packet command(identification code).
- Generate JSON and gRPC schema with
PacketSchema
. - Process device packets with uncomplicated packet structures.
- Process structures with complex packets, such as PLCs.
- Process packets that require speed, such as
MemoryPack
.
About
Generating Binary Serialization and properties for class
How to use
Example ( source csproj, source files )
- CSharp Project
- Program.cs
- Person.cs
This is the CSharp Project that references GenPack
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GenPack" Version=" 0.9.0-preview1" OutputItemType="Analyzer" ReferenceOutputAssembly="true" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
This is the use of GenPack in Program.cs
using SerializerDemo;
var p= new Person() { Name= "Andrei Ignat" };
var bytes= p.ToPacket();
var entity = Person.FromPacket(bytes);
Console.WriteLine("name is "+entity.Name);
This is the use of GenPack in Person.cs
using GenPack;
namespace SerializerDemo;
[GenPackable]
public partial record Person
{
public readonly static PacketSchema Schema = PacketSchemaBuilder.Create()
.@short("Id", "Age description")
.@string("Name", "Name description")
.Build();
}
Generated Files
Those are taken from $(BaseIntermediateOutputPath)\GX
- PersonSchema.g.cs
#pragma warning disable CS0219
namespace SerializerDemo
{
public partial record Person : GenPack.IGenPackable
{
/// <summary>
/// Age description
/// </summary>
public short Id { get; set; }
/// <summary>
/// Name description
/// </summary>
public string Name { get; set; } = string.Empty;
public byte[] ToPacket()
{
using var ms = new System.IO.MemoryStream();
ToPacket(ms);
return ms.ToArray();
}
public void ToPacket(System.IO.Stream stream)
{
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
writer.Write(Id);
writer.Write(Name);
}
public static SerializerDemo.Person FromPacket(byte[] data)
{
using var ms = new System.IO.MemoryStream(data);
return FromPacket(ms);
}
public static SerializerDemo.Person FromPacket(System.IO.Stream stream)
{
SerializerDemo.Person result = new SerializerDemo.Person();
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
int size = 0;
byte[] buffer = null;
result.Id = reader.ReadInt16();
result.Name = reader.ReadString();
return result;
}
}
}
Usefull
Download Example (.NET C# )
Share GenPack
https://ignatandrei.github.io/RSCG_Examples/v2/docs/GenPack