.net下二进制序列化的格式分析[转]

 
 

作者:zfive5

email:zfive5@yahoo.com.cn

相应c#下的序列化代码如下所示,程序把序列化后的数据存入了一个指定的文件file.bin里,分析这个文件数据主要为了能让非.Net下的应用程序读取序列化后数据,这有助于.net与其他语言平台的交互.

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace WindowsApplication2

{

[Serializable]

public class Object5

{

public int i1 = 0;

public int i2 = 0;

public float f3=0;

public string str;

}

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;

private System.ComponentModel.Container components = null;

public Form1()

{

InitializeComponent();

}

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows 窗体设计器生成的代码

private void InitializeComponent()

{

this.button1 = new System.Windows.Forms.Button();

this.SuspendLayout();

this.button1.Location = new System.Drawing.Point(72, 72);

this.button1.Name = "button1";

this.button1.Size = new System.Drawing.Size(128, 32);

this.button1.TabIndex = 0;

this.button1.Text = "button1";

this.button1.Click += new System.EventHandler(this.button1_Click);

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(292, 273);

this.Controls.Add(this.button1);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

#endregion

[STAThread]

static void Main()

{

Application.Run(new Form1());

}

private void button1_Click(object sender, System.EventArgs e)

{

Object5 obj = new Object5();

obj.i1 = 128;

obj.i2 = 24;

obj.f3=1.3f;

obj.str = "Some String";

double   d1=1.3d;

float    f1=1.3f;

int      i1=1;

string   s1="HelloWorld";

System.Runtime.Serialization.IFormatter formatter = newSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

System.IO.Stream stream = new System.IO.FileStream("File.bin", System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None);

formatter.Serialize(stream, obj);

formatter.Serialize(stream,d1);

formatter.Serialize(stream,f1);

formatter.Serialize(stream,i1);

formatter.Serialize(stream,s1);

stream.Close();

formatter=null;

}

}

}

文件内容如下图所示:

注解:

1 )00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 序列化头,经过实践分析,这部分基本在每个序列化后的数据都一样,下面也可以看到与其他的一样

2 )0C 02 被序列化后对象描述信息的表示符

3 )00 00 00 51(81)长度,(注意是大端的4位整型),说明后面对象描述信息的长度

4 )自定义对象的描述信息,分析时可以忽略,长度为81个字符(前一项以说明)

5 )05 01自定义对象的表示符 .

6 )00 00 00 1b (27)自定义对象类描述信息的长度

7 )自定义对象的描述信息,主要类的符号表示 (“WindowsApplication2.Object5”)

8 )自定义对象中的成员条目,例如在上面定义的对象中有四项,分别为int、int、flaot和string

9 )02 长度为2的int i1成员

10 )对应成员名称的定义标示 “i1”

11 )同9项

12 )同10项

13 )同 9项

14 )同 10项

15 )同 9项

16 )同10项

17 )说明自定义对象的各个定义项目是值对象还是其他类型,一共4个字节,00为值对象

01为字符对象 在上面定义的对象为 int i1 int i2 float f1 string str 对应为 00 00 00 01 。

18)说明17)对应的字段的类型 分别为 int 08  int 08  int 0b

19) 02 00 00 00 固定,说明其他数据的开始

20)对应obj.i1的值 80 00 00 00(128、小端格式)

21)对应obj.i2的值 18 00 00 00 (24、小端格式)

22)对应obj.f1的值 66 66 a6 3f  (1.3的浮点格式)

23)06 03 对象string标示符,说明它是string对象

24、25)00 00 00 0b string对象的长度11(大端),值为“Some String”

26)0b表示一个对象序列的结束。

27)同1)

28)04 01 double类型的表示符号

29)00 00 00 0d(13) 类型长度(大端)

30)对象定义标示符( “System.Double”)

31) 01 00 00 00(1)包含一个成员

32)07 (7)成员的定义标示符长度

33) 成员的定义符号 “m_value”

34) 00  说明是值类型  06说明是double类型

35)CD CC CC CC CC CC F4 3F  double类型对应的数值

36)0b一个序列对象的结束

其他的注释分析就在这里不在重复了,原理都一样的!

经过测试得到的类型与表示符的部分对应关系,如下所示

bool 01

byte 02

uint 0f

char 03

ulong 10

ushort  0e

decimal 05

int     08

sbyte   0a

short   07

double  06

float   0b

long    09

string  06 03 \06 04

值类型 00

string 01

object 02

[]     07

struct 04

这里分析只是一部份!主要随着对象的复杂,会涌现出没有分析到的标示符,如果你发现新的请给我发一封电子邮件,万分感谢!

这时大家也可以体会出为什么xml序列化的存在了,不同系统实现数据想要容易的多了,但xml有一个缺点就是数据量大.这是与二进制序列化所不能比的!

Xml序列化代码如下:

System.Xml.Serialization.XmlSerializer formatter=newSystem.Xml.Serialization.XmlSerializer(obj.GetType());

对象Object5序列化后的xml文件如下:

<?xml version="1.0"?>

<Object5 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<i1>128</i1>

<i2>24</i2>

<f3>1.3</f3>

<str>Some String</str>

</Object5>

简单吧!

 
分类: .Net(C#)

.net下二进制序列化的格式分析[转]的更多相关文章

  1. 常见压缩格式分析,及 Linux 下的压缩相关指令

    可先浏览加粗部分 一.常见压缩档 *.zip | zip 程式壓縮打包的檔案: (很常见,但是因为不包含文件名编码信息,跨平台可能会乱码) *.rar | winrar 程序压缩打包的档案:(在win ...

  2. C#高性能二进制序列化

    二进制序列化可以方便快捷的将对象进行持久化或者网络传输,并且体积小.性能高,应用面甚至还要高于json的序列化:开始之前,先来看看dotcore/dotne自带的二进制序列化:C#中对象序列化和反序列 ...

  3. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

  4. Google的Protocol Buffer格式分析

    [转]转自:序列化笔记之一:Google的Protocol Buffer格式分析 从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作 ...

  5. tcp、udp、ip、icmp报文格式分析

    TCP .UDP .IP. ICMP协议报文格式分析 Tcp报文格式: Wireshark抓包如图: 源端口/目的端口(16bit): 在TCP报文中包涵了源端口/目的端口,源端口标识了发送进程,目的 ...

  6. vsftp日志xferlog格式分析

    vsftp日志xferlog格式分析 [日期:2014-06-25] 来源:Linux社区  作者:Linux [字体:大 中 小]   1.开始vsftp记录日志.修改/etc/vsftpd/vsf ...

  7. IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

    1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...

  8. 网易云音乐ncm格式分析以及ncm与mp3格式转换

    目录 NCM格式分析 音频知识简介 两种可能 GitHub项目 格式分析 总体结构 密钥问题 代码分析 main函数 导入模块 dump函数 参考资料 代码完整版 转换工具 ncmdump ncmdu ...

  9. 开源!一款功能强大的高性能二进制序列化器Bssom.Net

    好久没更新博客了,我开源了一款高性能的二进制序列化器Bssom.Net和新颖的二进制协议Bssom,欢迎大家Star,欢迎参与项目贡献! Net开源技术交流群 976304396,禁止水,只能讨论技术 ...

随机推荐

  1. 关于苹果公司最新的语言Swift

    Swift供IOS和OSX新的编程语言开发的应用程序,吸取C和Objective-C质朴的语言.但没有损失C兼容性语言.Swift使用安全的编程模型.增加各种现代编程语言功能,使语言更容易掌握.更具可 ...

  2. SERVERCONFIG

    -- Create tablecreate table ERP_SERVERCONFIG( id NUMBER not null, servicename VARCHAR2(500), service ...

  3. 上传文件块client实现

    首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确 ...

  4. 【MySQL案件】ERROR 1418

    1.1.1. ERROR 1418 [环境的叙述性说明] mysql5.0.67 [问题叙述性说明] 当它来到创建存储过程ERROR 1418一个错误. # 创建函数SQL声明 CREATE FUNC ...

  5. 基于GeoHash算法的附近点搜索实现(一)

    1. 引入 最近在参加学校的计算机仿真大赛,时间好像有点不够,所以只完成了前面的一部分最基础的功能,中途还是选择了放弃.但是之前的部分的确觉得完成得还不错,在这里分享一下.题目是要完成一个宇宙飞船加油 ...

  6. C++虚函数表分析

    在<<反C++>>文中提到的 VC6.0 上的编译器支持一个d1reportAllClassLayout的开关, 能够输出全部对象的内存布局信息, 我自己经常使用vs2005来 ...

  7. Unity项目优化--开发项目的小经验

    原文地址:http://blog.csdn.net/liang_704959721/article/details/8548619 我们主要使用 3dsmax2010 进行制作,输出 FBX的类型导入 ...

  8. JSON-C结构简介、使用

    官方站点介绍http://www.json.org JSON (JavaScript Object Notation) is a lightweight data-interchange format ...

  9. oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)

    匿名PL/SQL块回顾 DECLARE (可选)     定义在PL/SQL块中要使用的对象 BEGIN (必须)     执行语句 EXCEPTION (可选)     错误处理语句 END; (必 ...

  10. 每天收获一点点------Hadoop之HDFS基础入门

    一.HDFS出现的背景 随着社会的进步,需要处理数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是却不方便管理和维护—>因此,迫切需要一种系统来管理多 ...