分享
 
 
 

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

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作者: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 = new System.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=new System.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>

简单吧!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有