.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. 经纪xx系统节点VIP案例介绍和深入分析异常

    系统环境    硬件平台 &  操作 IBM 570 操作系统版本号  AIX 5.3 物理内存  32G Oracle 产品及版本号  10.2.0.5 RAC 业务类型  OLTP 背 ...

  2. 股票作手回忆录Digest(转)

    记住,驱动股市的不是理智.逻辑或纯经济因素,驱动股市的是从来不会改变的人的本性.它不会改变,因为它是我们的本性.[4] 在华尔街或在股票投机中,没有什么新的东西.过去发生的事情在将来会一而再,再而三地 ...

  3. 获取鼠标点击相对于Canva位置的2种方法

    如果给Canvas添加 onmousedown事件,获取到的鼠标位置都是相对于当前文档的位置(x,y):

  4. WPF学习(11)2D绘图

    本篇我们来学习WPF的绘图,在2D绘图中主要有这么几个重要的类:Drawing.Visual和Shape,顺便讲下Brush和BitmapEffect. 1 2D绘图 1.1Drawing类 Draw ...

  5. Java IO的RandomAccessFile的使用(转)

    现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...

  6. HTTP工作原理

     HTTP工作过程 HTTP协议定义Webclient怎样从Webserver请求Web页面,以及server怎样把Web页面传送给client.HTTP协议採用了请求/响应模型. client向 ...

  7. Team Foundation Server 2015使用教程--默认团队权限说明

  8. Robot Framework 使用1-环境配置及简单网站兼容性测试(转)

    0.Robot Framework 简介 Robot Framework 是一个通用的自动化测试框架,主要用于“验收测试”和“验收测试驱动开发(ATDD)” (会其它文章中会详细介绍ATDD).它使用 ...

  9. [HAOI2005]路由问题,第二短路

    [问题描写叙述]     X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径.遗憾的是.因为种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点 ...

  10. HDU 4349 Xiao Ming&#39;s Hope

    非常无语的一个题. 反正我后来看题解全然不是一个道上的. 要用什么组合数学的lucas定理. 表示自己就推了前面几个数然后找找规律. C(n, m) 就是 组合n取m: (m!(n-m!)/n!) 假 ...