| name | serde |
| nuget | https://www.nuget.org/packages/serde/ |
| link | https://github.com/serdedotnet/serde |
| author | Andy Gocke |
Serializing in SERDE format
This is how you can use serde .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serde" Version="0.17.1" />
</ItemGroup>
</Project>
The code that you will use is
using Serde.Json;
using SerializerDemo;
Person p = new () { Name= "Andrei Ignat" , Age=55};
var utf8= JsonSerializer.Serialize<Person>(p);
Console.WriteLine(utf8);
var p1 = JsonSerializer.Deserialize<Person>(utf8);
Console.WriteLine(p.Name);
Console.WriteLine(p1.Age);
using Serde;
namespace SerializerDemo;
[GenerateSerde]
public partial class Person
{
public int Age { get; set; }
public string Name { get; set; } = string.Empty;
}
The code that is generated is
#nullable enable
using System;
using Serde;
namespace SerializerDemo;
partial class Person
{
sealed partial class _SerdeObj : global::Serde.ISerde<SerializerDemo.Person>
{
global::Serde.ISerdeInfo global::Serde.ISerdeInfoProvider.SerdeInfo => SerializerDemo.Person.s_serdeInfo;
void global::Serde.ISerialize<SerializerDemo.Person>.Serialize(SerializerDemo.Person value, global::Serde.ISerializer serializer)
{
var _l_info = global::Serde.SerdeInfoProvider.GetInfo(this);
var _l_type = serializer.WriteType(_l_info, 2);
_l_type.WriteI32(_l_info, 0, value.Age);
_l_type.WriteString(_l_info, 1, value.Name);
_l_type.End(_l_info);
}
SerializerDemo.Person Serde.IDeserialize<SerializerDemo.Person>.Deserialize(IDeserializer deserializer)
{
int _l_age = default!;
string _l_name = string.Empty;
byte _r_assignedValid = 0;
var _l_serdeInfo = global::Serde.SerdeInfoProvider.GetInfo(this);
var typeDeserialize = deserializer.ReadType(_l_serdeInfo);
while (true)
{
var (_l_index_, _) = typeDeserialize.TryReadIndexWithName(_l_serdeInfo);
if (_l_index_ == Serde.ITypeDeserializer.EndOfType)
{
break;
}
switch (_l_index_)
{
case 0:
Serde.DeserializeException.ThrowIfDuplicate(_r_assignedValid, 0, _l_serdeInfo);
_l_age = typeDeserialize.ReadI32(_l_serdeInfo, _l_index_);
_r_assignedValid |= ((byte)1) << 0;
break;
case 1:
Serde.DeserializeException.ThrowIfDuplicate(_r_assignedValid, 1, _l_serdeInfo);
_l_name = typeDeserialize.ReadString(_l_serdeInfo, _l_index_);
_r_assignedValid |= ((byte)1) << 1;
break;
case Serde.ITypeDeserializer.IndexNotFound:
typeDeserialize.SkipValue(_l_serdeInfo, _l_index_);
break;
default:
throw new InvalidOperationException("Unexpected index: " + _l_index_);
}
}
typeDeserialize.End(_l_serdeInfo);
if ((_r_assignedValid & 0b1) != 0b1)
{
throw Serde.DeserializeException.UnassignedMember();
}
var newType = new SerializerDemo.Person() {
Age = _l_age,
Name = _l_name,
};
return newType;
}
}
}
[/code]
[code lang="csharp"]
#nullable enable
namespace SerializerDemo;
partial class Person
{
private static global::Serde.ISerdeInfo s_serdeInfo = Serde.SerdeInfo.MakeCustom(
"Person",
typeof(SerializerDemo.Person).GetCustomAttributesData(),
new global::Serde.SerdeInfo.FieldInfo[] {
new("age", global::Serde.SerdeInfoProvider.GetSerializeInfo<int, global::Serde.I32Proxy>()),
new("name", global::Serde.SerdeInfoProvider.GetSerializeInfo<string, global::Serde.StringProxy>())
}
);
}
namespace SerializerDemo;
partial class Person : Serde.ISerdeProvider<SerializerDemo.Person, SerializerDemo.Person._SerdeObj, SerializerDemo.Person>
{
static SerializerDemo.Person._SerdeObj global::Serde.ISerdeProvider<SerializerDemo.Person, SerializerDemo.Person._SerdeObj, SerializerDemo.Person>.Instance { get; }
= new SerializerDemo.Person._SerdeObj();
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/serde