RSCG – MemoryPack
| name | MemoryPack |
| nuget | https://www.nuget.org/packages/MemoryPack/ |
| link | https://github.com/Cysharp/MemoryPack |
| author | Cysharp,Inc |
Efficient serializer
This is how you can use MemoryPack .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MemoryPack" Version="1.9.16" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
The code that you will use is
var v = new Person { Age = 53,Name = "Andrei Ignat" };
var bin = MemoryPackSerializer.Serialize(v);
var val = MemoryPackSerializer.Deserialize<Person>(bin);
Console.WriteLine(val.Name);
namespace MemoryPackDemo;
[MemoryPackable]
public partial class Person
{
public int Age { get; set; }
public string? Name { get; set; }
}
The code that is generated is
// <auto-generated/>
#nullable enable
#pragma warning disable CS0108 // hides inherited member
#pragma warning disable CS0162 // Unreachable code
#pragma warning disable CS0164 // This label has not been referenced
#pragma warning disable CS0219 // Variable assigned but never used
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type.
#pragma warning disable CS8601 // Possible null reference assignment
#pragma warning disable CS8602
#pragma warning disable CS8604 // Possible null reference argument for parameter
#pragma warning disable CS8619
#pragma warning disable CS8620
#pragma warning disable CS8631 // The type cannot be used as type parameter in the generic type or method
#pragma warning disable CS8765 // Nullability of type of parameter
#pragma warning disable CS9074 // The 'scoped' modifier of parameter doesn't match overridden or implemented member
#pragma warning disable CA1050 // Declare types in namespaces.
using System;
using MemoryPack;
namespace MemoryPackDemo;
/// <remarks>
/// MemoryPack GenerateType: Object<br/>
/// <code>
/// <b>int</b> Age<br/>
/// <b>string</b> Name<br/>
/// </code>
/// </remarks>
partial class Person : IMemoryPackable<Person>
{
static Person()
{
global::MemoryPack.MemoryPackFormatterProvider.Register<Person>();
}
[global::MemoryPack.Internal.Preserve]
static void IMemoryPackFormatterRegister.RegisterFormatter()
{
if (!global::MemoryPack.MemoryPackFormatterProvider.IsRegistered<Person>())
{
global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MemoryPack.Formatters.MemoryPackableFormatter<Person>());
}
if (!global::MemoryPack.MemoryPackFormatterProvider.IsRegistered<Person[]>())
{
global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MemoryPack.Formatters.ArrayFormatter<Person>());
}
}
[global::MemoryPack.Internal.Preserve]
static void IMemoryPackable<Person>.Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer,scoped ref Person? value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
goto END;
}
writer.WriteUnmanagedWithObjectHeader(2,value.@Age);
writer.WriteString(value.@Name);
END:
return;
}
[global::MemoryPack.Internal.Preserve]
static void IMemoryPackable<Person>.Deserialize(ref MemoryPackReader reader,scoped ref Person? value)
{
if (!reader.TryReadObjectHeader(out var count))
{
value = default!;
goto END;
}
int __Age;
string __Name;
if (count == 2)
{
if (value == null)
{
reader.ReadUnmanaged(out __Age);
__Name = reader.ReadString();
goto NEW;
}
else
{
__Age = value.@Age;
__Name = value.@Name;
reader.ReadUnmanaged(out __Age);
__Name = reader.ReadString();
goto SET;
}
}
else if (count > 2)
{
MemoryPackSerializationException.ThrowInvalidPropertyCount(typeof(Person),2,count);
goto READ_END;
}
else
{
if (value == null)
{
__Age = default!;
__Name = default!;
}
else
{
__Age = value.@Age;
__Name = value.@Name;
}
if (count == 0) goto SKIP_READ;
reader.ReadUnmanaged(out __Age); if (count == 1) goto SKIP_READ;
__Name = reader.ReadString(); if (count == 2) goto SKIP_READ;
SKIP_READ:
if (value == null)
{
goto NEW;
}
else
{
goto SET;
}
}
SET:
value.@Age = __Age;
value.@Name = __Name;
goto READ_END;
NEW:
value = new Person()
{
@Age = __Age,
@Name = __Name
};
READ_END:
END:
return;
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/MemoryPack
Leave a Reply