SyminStudio.Binaryer
0.1.0
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package SyminStudio.Binaryer --version 0.1.0
NuGet\Install-Package SyminStudio.Binaryer -Version 0.1.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SyminStudio.Binaryer" Version="0.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="SyminStudio.Binaryer" Version="0.1.0" />
<PackageReference Include="SyminStudio.Binaryer" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add SyminStudio.Binaryer --version 0.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: SyminStudio.Binaryer, 0.1.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package SyminStudio.Binaryer@0.1.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=SyminStudio.Binaryer&version=0.1.0
#tool nuget:?package=SyminStudio.Binaryer&version=0.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Binaryer - 二进制序列化源生成器
概述
这是一个基于 C# Source Generator 的二进制序列化框架,通过 Attribute 标注自动生成高效的二进制读写代码。设计目标是简化二进制数据格式的处理,特别适用于需要精确控制二进制布局的场景。
注意:此项目目前处于开发阶段,
ReadFromStream
方法基本通过测试,WriteToStream
方法仍在完善中。
主要特性
1. 基础序列化 (StreamSerializable
)
- 标记需要生成序列化代码的类
- 自动生成
ReadFromStream
和WriteToStream
方法 - 跟踪实际序列化大小 (
BinaryActualSize
)
2. 属性序列化 (BinaryProperty
)
- 支持基本类型:
int
,double
,float
,bool
,byte
,char
等 - 支持字符串和字节数组
- 支持固定长度(测试中)和自动长度检测
- 支持从属性或方法获取长度
[BinaryProperty(Length = 4)]
public int Value { get; set; }
[BinaryProperty] // 自动检测长度
public double AutoSize { get; set; }
3. 跳过字节 (BinarySkip
)
- 在序列化时插入指定字节数的填充
- 在反序列化时跳过指定字节数
- 支持固定长度和动态长度
[BinarySkip(Length = 4)] // 跳过 4 字节
[BinaryProperty]
public int ValueAfterSkip { get; set; }
4. 条件序列化 (BinaryCondition
)
- 根据其他属性或方法的值决定是否序列化
- 支持复杂的条件逻辑
[BinaryProperty]
public bool HasExtraData { get; set; }
[BinaryCondition(ConditionFromProperty = nameof(HasExtraData))]
[BinaryProperty(Length = 8)]
public double ExtraData { get; set; }
5. 重复序列化 (BinaryRepeat
)
- 支持集合类型的序列化
- 支持固定次数重复和动态次数重复
- 支持从属性或方法获取重复次数
[BinaryProperty]
public int Count { get; set; }
[BinaryRepeat(RepeatCountFromProperty = nameof(Count))]
[BinaryProperty(Length = 16)]
public List<string> Messages { get; set; }
[BinaryRepeat(RepeatCount = 3)] // 固定重复 3 次
[BinaryProperty]
public List<int> Numbers { get; set; }
使用示例
基础使用
using SyminStudio.Binaryer.Abstractions;
[StreamSerializable]
public partial class MyBinaryModel
{
[BinaryProperty(Length = 4)]
public int Value1 { get; set; }
[BinaryProperty(Length = 8)]
public double Value2 { get; set; }
[BinaryProperty(Length = 32)]
public string Message { get; set; } = "";
}
// 使用
var model = new MyBinaryModel
{
Value1 = 42,
Value2 = 3.14159,
Message = "Hello World"
};
using var stream = new MemoryStream();
// 序列化
model.WriteToStream(stream);
// 反序列化
stream.Position = 0;
var newModel = new MyBinaryModel();
newModel.ReadFromStream(stream);
复杂示例
[StreamSerializable]
public partial class ComplexBinaryFormat
{
[SkipBytes(Length = 4)] // 跳过文件头
[BinaryProperty(Length = 8)]
public double Version { get; set; }
[BinaryProperty]
public int RecordCount { get; set; }
[BinaryProperty]
public bool HasMetadata { get; set; }
[BinaryCondition(ConditionFromProperty = nameof(HasMetadata))]
[BinaryProperty(Length = 64)]
public string Metadata { get; set; } = "";
[BinaryRepeat(RepeatCountFromProperty = nameof(RecordCount))]
[BinaryProperty(Length = 32)]
public List<string> Records { get; set; } = new();
// 这个属性不会被序列化
public int CalculatedValue { get; set; }
}
技术实现
源生成器架构
- 属性分析器 - 分析类和属性上的特性标注
- 代码生成器 - 生成对应的序列化和反序列化代码
- 类型系统 - 支持多种数据类型的自动处理
- 缓冲区优化 - 自动计算所需的最大缓冲区大小
生成的代码特点
- 高效的二进制读写操作
- 精确的内存管理
- 完整的错误处理
- 大小端序自动处理(使用 BitConverter)
- 字符串编码统一使用 UTF-8
性能特点
- 零反射 - 使用源生成器生成静态代码,无运行时反射开销
- 内存友好 - 使用缓冲区重用,减少内存分配
- 高效编码 - 直接使用 BitConverter 进行类型转换
- 精确控制 - 可以精确控制二进制布局和填充
扩展性
框架设计具有良好的扩展性:
- 新增数据类型支持 - 可以轻松添加新的基础类型支持
- 自定义序列化逻辑 - 支持复杂类型的嵌套序列化
- 动态长度计算 - 支持从方法获取长度和重复次数
- 条件逻辑扩展 - 支持复杂的条件表达式
这个源生成器为处理二进制数据格式提供了一个强大、灵活且高效的解决方案,特别适用于文件格式解析、网络协议处理、设备通信等场景。
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Microsoft.CodeAnalysis.CSharp (>= 4.3.0)
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Basic read function generator