Julia与C#间BSON嵌套对象数据(反)序列化实现方案咨询
实现思路指引
1 先修正基础数据模型的问题
原来的静态报错大多来自模型字段和BSON结构不匹配,调整为如下结构即可解决:
- 把
JuliaType的属性param重命名为Params,和BSON中的params字段对应 - 把
JuliaObject的size属性改为int[]类型,适配多维度数组的长度定义 - 把
JuliaObject的data属性改为object类型,兼容字符串、二进制、数组等多种数据格式 - 新增静态类型映射字典,存储Julia类型名到C#类型的双向映射,示例:
public static Dictionary<string, Type> JuliaToCSharpTypeMap = new Dictionary<string, Type> { {"Core.Int8", typeof(sbyte)}, {"Core.Float64", typeof(double)}, {"Base.Complex{Core.Float64}", typeof(System.Numerics.Complex)} // 新增类型仅需在此添加条目即可 };
2 分模块实现转换器逻辑
你只需要实现2个通用转换器即可覆盖所有场景,不需要为每个业务类型单独写转换器:
2.1 JuliaTypeConverter
这个转换器仅负责处理JuliaType类型的序列化反序列化,逻辑完全固定,不需要后续修改:
CanConvert仅返回objectType == typeof(JuliaType)即可- 反序列化直接读取
tag、params、name三个字段赋值即可 - 序列化按BSON要求的字段名输出对应值即可
2.2 主转换器JuliaBSONConverter
这个转换器负责所有业务数据的(反)序列化,按tag分支处理逻辑:
反序列化(ReadJson)逻辑:
- 读取当前节点为
JObject,判断是否存在tag字段:- 不存在:说明是原生标量,直接调用
serializer.Deserialize返回原生值即可 - 存在:根据
tag值走对应分支
- 不存在:说明是原生标量,直接调用
tag == "array"分支:- 解析
type字段为JuliaType,查表得到对应的C#元素类型 - 解析
size字段为int[],调用Array.CreateInstance创建对应维度的数组 - 把
data字段的base64字符串转为byte[],用Buffer.BlockCopy按字节拷贝到目标数组即可(注意Julia数组是列优先存储,和C#多维数组存储顺序一致,不需要调整顺序)
- 解析
tag == "struct"分支:- 解析
type字段为JuliaType,查表得到对应的C#类类型 - 调用
serializer.Deserialize把data字段内容直接转为目标类实例即可
- 解析
序列化(WriteJson)逻辑:
- 判断传入值的类型:
- 是原生标量:直接调用
serializer.Serialize输出值即可 - 是数组:输出
tag = "array",查表得到对应的Julia类型写入type字段,读取数组各维度长度写入size字段,把数组字节流转base64写入data字段 - 是自定义类:输出
tag = "struct",查表得到对应的Julia类型写入type字段,把类的字段序列化后写入data字段
- 是原生标量:直接调用
3 注册使用
把两个转换器注册到Json.NET的BSON序列化器配置中,所有和Julia交互的序列化/反序列化操作都使用这个配置即可,新增业务类型时仅需要在类型映射字典中添加对应条目,不需要修改转换器代码。
内容的提问来源于stack exchange,提问作者BambOo
相关产品推荐
相关产品推荐

