一个C#版的序列化/反序列化器-SharpSerialization

    项目地址:https://sourceforge.net/projects/sharpserialization/

    我们的实际工作中经常会遇到跨语言的交互,如Java-C#-C++等,大部分情况下通过Xml、Json数据交换等协议可以很好的处理对象的交互,但有时我们希望数据流变得更小,性能变得更好,但同时又不想对现有程序做过多修改或者不想对每个协议对象编写特定的代码,这时,一个良好的二进制序列化器是自然的一个考虑,对于.Net语言间的交互,Framework自带的序列化器是自然也很好的选择,但当我们相同Java交互时又会力不从心了。SharpSerialization就是为了应付此种局面提出的。

  SharpSerialization是一个轻量的序列化/反序列化器,可方便简单的用于.net对象的序列化,反序列化,本项目的目标并不是替代Framework的序列化系统,也并不是为了造轮子而造轮子,仅用于演示序列化系统的基本原理。本项目用于学习研究目的,并未经过严格测试,性能并不是项目的考虑要素(如对反射部分可使用EMIT等技术代替等),因此,请不要在实际项目中直接应用; 需要的朋友可以此为基础优化然后使用。
SharpSerialization的序列化协议如下:

  一、 类型系统

类型 说明
BOOLEAN 0
1=true;

0=false;

INT8 1 sbyte
UINT8 2 byte
INT16  3 short
UINT16  4 ushort
INT32  5 int
UINT32  6 uint
INT64  7 long
UINT64  8 ulong
FLOAT  9 float
DOUBLE  10 double
DECIMAL  11 decimal以double值序列化。如需以原值序列化,请修改代码,把decimal处理为非内置类型
DATETIME  12 以DateTime.Ticks值序列化
STRING  13 7-bits编码长度+字符串的UTF-字节流
OBJECT  14 class/struct
NULL  15 null
MASK_ARRAY  16  数组标志位,与其他简单类型通过逻辑或组成数组类型。
 如int[] = INT32 | Array = 0x6 | 0x80;
  double[] = DOUBLE | Array = 0x0b | 0x80;

  二、二进制序列化器流协议

   默认提供的二进制序列化器BinarySerializer同时提供序列化和反序列化的能力,以二进制流的形式序列化/反序列化对象。
 注意:本协议流并未处理数据校验等,如需应用实际项目,请自行添加。
   数据协议:
   1、 对于内置类型(BOOLEAN - STRING),直接写入类型值+类型的实际值数据。如Int32值10,依次写入数据为:
     > 1字节类型值:5
     > 4字节INT32值(Little-Endian):10
   2、 对于非内置类型,格式为:
     > 1字节类型OBJECT值:14
     > 类型名称字符串:Type.FullName,Assembly.Name
     > 8字节ObjectID,详见下文说明
     > 4字节类型的成员个数(INT32)
     > 依次写入每个成员的名称、值
   3、 对于数组类型,格式为:
     > 1字节数组类型值:MASK_ARRAY | 基础类型值。
     > 类型名称字符串:Type.FullName,Assembly.Name。
     > 4字节数组的维数(INT32)。
     > 依次写入每个维度的秩(INT32)。
     > 依次写入每个元素。

  三、用法示例:

  

 1 using SharpSerialization;
 2     using System;
 3     using System.Collections.Generic;
 4     using System.IO;
 5     using System.Text;
 6
 7     class MyObject
 8     {
 9         int m_id;
10         string m_name;
11
12         MyObject2 m_crossReference;
13
14         public int ID
15         {
16             get { return m_id; }
17         }
18         public string Name
19         {
20             get { return m_name; }
21         }
22
23         public MyObject2 CrossReference
24         {
25             get { return m_crossReference; }
26             set { m_crossReference = value; }
27         }
28
29         public MyObject(int id, string name, MyObject2 cro)
30         {
31             m_id = id;
32             m_name = name;
33             m_crossReference = cro;
34         }
35     }
36
37     class MyObject2
38     {
39         string m_name;
40         MyObject m_interObj;
41
42         public string Name
43         {
44             get { return m_name; }
45         }
46
47         public MyObject InterObj
48         {
49             get { return m_interObj; }
50         }
51
52         public MyObject2(string name, MyObject obj)
53         {
54             m_name = name;
55             m_interObj = obj;
56         }
57     }
58
59
60     class Serialization
61     {
62
63         static void Main(string[] args)
64         {
65             MyObject obj = new MyObject(1, "MyObject", null);
66             MyObject2 obj2 = new MyObject2("MyObject2", obj);
67             obj.CrossReference = obj2;
68
69
70             using (MemoryStream ms = new MemoryStream())
71             {
72                 BinaryStream bs = new BinaryStream(ms);
73
74                 BinarySerializer<BinaryStream> serializer = new BinarySerializer<BinaryStream>(bs);
75
76                 serializer.Serialize(obj);
77
78                 ms.Seek(0, SeekOrigin.Begin);
79
80                 MyObject nOb = (MyObject)serializer.Deserialize();
81
82                 Console.WriteLine(nOb.ID);
83                 Console.WriteLine(nOb.Name);
84                 Console.WriteLine(nOb.CrossReference.Name);
85             }
86
87             Console.ReadLine();
88         }
89     }

时间: 2024-10-09 21:37:01

一个C#版的序列化/反序列化器-SharpSerialization的相关文章

分享一个近期写的简单版的网页采集器

分享一个近期写的简单版的网页采集器 功能特点: 1.可通过配置,保存采集规则. 2.可通过采集规则,进行数据采集. 3.可分页,分关键字,进行采集. 4.可保存数据至数据库,文本中. ........... 功能还比较简单,喜欢深入的可以继续深入下去,暂时还没有登录的功能,因为登录功能涉及到的范围比较广,待日后慢慢研究后再开发. 我先上个图让大家一睹为快吧: 首先看看页面,我们要采集这个网站的文章 接下来,首先是查找分页,获得分页里面的文章链接,接着查找内容页需要采集的字段,生成规则,进行采集.

TaskScheduler一个.NET版任务调度器

TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式满足日历形式的复杂触发规则: 支持动态添加和删除任务,可根据具体需求实现复杂逻辑: static void Main(string[] args) { Scheduler scheduler = new Scheduler(); SimpleTrigger simpleTrigger = new S

一个更好的C++序列化/反序列化库Kapok

KapokFAQ1.Kapok的特点简单,易用,header-only,只需要引用Kapok.hpp即可:高效,初步测试性和messagepack相当.它是纯c++11实现,因此需要支持C++11的编译器. 2.主要功能对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧. //序列化 Serializer sr; auto tp = std::make_tuple(10, 12, string("test")); sr.Serialize

.net 序列化反序列化

.net 序列化创建对象的深拷贝 public static object DeepClone(object original) { using (MemoryStream stream = new MemoryStream()) { //构造序列化格式化器来执行所有实习工作 BinaryFormatter formatter = new BinaryFormatter(); //流上下文 formatter.Context = new StreamingContext(StreamingCon

java Serializable和Externalizable序列化反序列化详解--转

一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化).serialization 不但可以在本机做,而且可以经由网络操作.它自动屏蔽了操作系统的差异,字节顺序等.比如,在 Windows 平台生成一个对象并序列化之,然后通过网络传到一台 Unix 机器上,然后可以在这台Un

.NET序列化反序列化总结

一直想写这个专题,但是工作后人很懒散,总下不了决心,今天一个人在家就写下来. 关于序列化,可以总结出它的作用有以下几点: 1.记录应用程序的状态,在下次启动时还原上次的状态. 2.进程之间的通信,如使用socket编程时使用.这里的进程包括同一台主机之间进程的通信,也包括不同主机之间的通信. 3.作为对象的深拷贝的一种实现方式. .net中的序列化支持下面几种序列化机制: 1.使可序列化的类型序列化和反序列化 2.控制可序列化的类型的序列化/反序列化内容和过程 3.将类型序列化/反序列化为不同的

ModelSerializer(重点) 基表 测试脚本 多表关系建外键 正反查 级联 插拔式连表 序列化反序列化整合 增删查 封装response

一.前戏要做好 配置:settings.py #注册drf INSTALLED_APPS = [ # ... 'api.apps.ApiConfig', 'rest_framework', ] ? #配置数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dg_proj', 'USER': 'root', 'PASSWORD': '123', } } """ 在任何(根或者

序列化反序列化

对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值. 下面是一个序列化对象写入文件的例子: ---------------------------- 1 package utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.O

python json 序列化反序列化 和 中文编码问题

在一个项目中,需要从云端获取一个json格式的数据,并保存到本地文件中,然后再读取出来,这中间要用到json的dumps方法和loads方法,以实现数据的序列化和反序列化.具体来说,dumps方法,可将json格式数据序列为python的相关的数据类型,通常用于打印等:loads方法则是相反,把python数据类型转换为json相应的数据类型格式要求,反序列化后可以对json数据进行各种操作.在编程过程还发现一个问题,在序列化时,中文汉字总是被转换为unicode码,在网上搜索后发现,在dump