当前位置: 首页 > news >正文

使用反射对任意对象进行二进制序列化的程序

背景

进行网络通信时,或者希望本地存储文件加密时,可以用二进制序列化。序列化时要把类的基本类型字段一个个序列化,遇到成员类要把成员类的基本类型成员也序列化。这样每个类都要有一个专门的序列化程序,这是令人难以接受的。需要封装一些代码,有不同的封装方案。

  1. 把各种基本数据类型的序列化封装成函数,把一个类序列化时按字段的顺序和类型手动调用这些函数。不过除了字符串麻烦点,其他类型序列化都只要一行;
  2. 写一个接收object的函数,使用GetFields()得到每个字段的类型,按类型序列化;

还面临的问题是:

  1. 结果字节数组的长度是由所有字段的个数和类型决定的。需要对每个字段判断类型、对字符串确定长度后才能知道结果字节数组的长度。不可能预先知道结果字节数组的长度。

想到列表可以改变长度,可以先声明一个byte列表,把字段序列化后加到列表后面,全部加完后变成数组。

public class MyBinSerDes
{static MyBinSerDes instance = new MyBinSerDes();public static MyBinSerDes Instance => instance;public byte[] ToBytes(object data){Type dataType = data.GetType();FieldInfo[] fieldInfos = dataType.GetFields();List<byte> byteList = new List<byte>();for (int i = 0; i < fieldInfos.Length; i++){byte[] bytes;object field=fieldInfos[i].GetValue(data);if (field.GetType() == typeof(string)){string str = field as string;byte[] strBytes = Encoding.UTF8.GetBytes(str);bytes = new byte[sizeof(int) + strBytes.Length];BitConverter.GetBytes(strBytes.Length).CopyTo(bytes, 0);strBytes.CopyTo(bytes, sizeof(int));}else if (field.GetType() == typeof(int)){bytes = BitConverter.GetBytes((int)field);}else if (field.GetType() == typeof(float)){bytes = BitConverter.GetBytes((float)field);}else if (field.GetType() == typeof(bool)){bytes = BitConverter.GetBytes((bool)field);}else{#if UNITY_EDITORDebug.Log("字段类型不支持!");#endifbytes = null;}byteList.AddRange(bytes.ToList());}return byteList.ToArray();}
}

相关文章:

  • Gemini开源项目DeepResearch:基于LangGraph的智能研究代理技术原理与实现
  • 目标检测实战:让AI“看见“并定位物体(superior哥AI系列第11期)
  • Offline Transition Modeling via Contrastive Energy Learning
  • Nginx学习笔记
  • 百事公司借力一级方程式赛车拓展全球市场
  • gc2053驱动学习笔记
  • Python训练营---Day45
  • 60天python训练计划----day45
  • 《汇编语言》第15章 外中断
  • 从《现实不似你所见》探寻与缘起性空的思想交织
  • 【定昌linux开发板】关闭ssh 端口 22
  • 使用DrissionPage与Tkinter构建专业级抖音数据分析工具
  • 对象数组练习(增删改查)
  • 基于STM32的DS18B20温度远程监测LCD1602显示
  • float和float32有什么区别
  • ArcGIS Pro 3.4 二次开发 - 宗地
  • Python实例题:Python计算二元二次方程组
  • 当.txt无法打开,如何恢复成记事本
  • 【react+antd+vite】优雅的引入svg和阿里巴巴图标
  • js常用函数总结
  • 做教程网站资源放哪里/不花钱网站推广
  • 宠物网站建设的目的/博客网站登录
  • 公司网站建设的申请/网站建设首页
  • 长沙企业官方网站建设/上优化seo
  • 荔湾区做网站公司/广州外包网络推广公司
  • 屏边县住房和城乡建设局网站/百度广告公司