.net下二进制序列化的格式分析[转]
.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下二进制序列化的格式分析[转]的更多相关文章
- 常见压缩格式分析,及 Linux 下的压缩相关指令
可先浏览加粗部分 一.常见压缩档 *.zip | zip 程式壓縮打包的檔案: (很常见,但是因为不包含文件名编码信息,跨平台可能会乱码) *.rar | winrar 程序压缩打包的档案:(在win ...
- C#高性能二进制序列化
二进制序列化可以方便快捷的将对象进行持久化或者网络传输,并且体积小.性能高,应用面甚至还要高于json的序列化:开始之前,先来看看dotcore/dotne自带的二进制序列化:C#中对象序列化和反序列 ...
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
线程安全使用(四) 这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...
- Google的Protocol Buffer格式分析
[转]转自:序列化笔记之一:Google的Protocol Buffer格式分析 从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作 ...
- tcp、udp、ip、icmp报文格式分析
TCP .UDP .IP. ICMP协议报文格式分析 Tcp报文格式: Wireshark抓包如图: 源端口/目的端口(16bit): 在TCP报文中包涵了源端口/目的端口,源端口标识了发送进程,目的 ...
- vsftp日志xferlog格式分析
vsftp日志xferlog格式分析 [日期:2014-06-25] 来源:Linux社区 作者:Linux [字体:大 中 小] 1.开始vsftp记录日志.修改/etc/vsftpd/vsf ...
- IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除
1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...
- 网易云音乐ncm格式分析以及ncm与mp3格式转换
目录 NCM格式分析 音频知识简介 两种可能 GitHub项目 格式分析 总体结构 密钥问题 代码分析 main函数 导入模块 dump函数 参考资料 代码完整版 转换工具 ncmdump ncmdu ...
- 开源!一款功能强大的高性能二进制序列化器Bssom.Net
好久没更新博客了,我开源了一款高性能的二进制序列化器Bssom.Net和新颖的二进制协议Bssom,欢迎大家Star,欢迎参与项目贡献! Net开源技术交流群 976304396,禁止水,只能讨论技术 ...
随机推荐
- 更改IOS于UISearchBar撤消button底、搜索输入文本框背景中的内容和UISearchBar底
转载请标明出处:http://blog.csdn.net/android_ls/article/details/39993433 測试的手机IOS系统版本为:6.1.3,实现过程例如以下: 1.加入U ...
- js Array 阵列扩展方法
//又来了 Array.prototype.unique = function() { this.sort(); var re=[this[0]]; for(var i = 1; i < thi ...
- Nginx并发訪问优化
Nginx反向代理并发能力的强弱,直接影响到系统的稳定性.安装Nginx过程,默认配置并不涉及到过多的并发參数,作为产品执行,不得不考虑这些因素.Nginx作为产品执行,官方建议部署到Linux64位 ...
- hdu4758 Walk Through Squares 自动机+DP
题意:给n*m的地图,在地图的点上走,(n+1)*(m+1)个点,两种操作:往下走D和往右走R.现在要从左上角走到右下角,给定两个操作串,问包含这两个串的走法总共有多少种. 做法:用这两个串构建自动机 ...
- Display Database Image using MS SQL Server 2008 Reporting Services
原文 Display Database Image using MS SQL Server 2008 Reporting Services With the new release of MS SQL ...
- android之Fragment(官网资料翻译)
Fragment要点 Fragment作为Activity界面的一部分组成出现 能够在一个Activity中同一时候出现多个Fragment,而且,一个Fragment亦可在多个Activity中使用 ...
- asp.net学习之ado.net(无连接模式中的DataAdapter)
原文:asp.net学习之ado.net(无连接模式中的DataAdapter) 在非连接模式下,主要讨论以下对象:DataAdapter. DataAdpater的作用是在物理存储模式的数据 ...
- ORACLE 动态注册和静态注册的区别(转)
1, oracle 10g 用netca方式建立的都默认为动态注册方式2,如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER = (SID_L ...
- Dynamics CRM2013/2015 禁止欢迎屏幕(Disable the Welcome Screen)
首先打开Dynamic CRM 2013将有一个欢迎界面的例子,下面的图,它不会为了图检查框出现.OK然后,下一次打开就没有. 可是当我们打开F12开发者工具,清除域的缓存后再次打开CRM,这个欢迎 ...
- 大数据系列修炼-Scala课程10
今天主要是关于Scala中对List的相关操作,list在Scala中应该是至关重要,接下来会讲解关于List的一系列操作 List的map.flatMap.foreach.filter操作讲解 1. ...