我最近学习remoting和web服务时,总是看到一个重要的字眼"序列化".
那什么是序列化呢?
以前我也模模糊糊.
为了搞清楚,请和我一起来序列化学习之旅吧.
让我们先看看序列化的定义,以下是微软的说明:
序列化可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确复本
序列化一般用在2种地方:
1.将数据保持到存储中
例如:我知道在Asp.Net Forums中有.Net中序列化和反序列化的应用
在Forums中,有些内容是不固定的,如用户资料,除了一些基本资料,可能还要MSN、个人主页、签名等.我们一般是一个属性对应于表中的一个字段,要是以后我们增加一些新属性,就得增加表字段,还要修改存储过程,这样其不麻烦?
在Asp.Net Forums中把用户资料序列化为2进制,这样用一个表字段就可以解决问题,并且扩展性好。
2.通过值将对象从一个应用程序域发送到另一个应用程序域中
remoting和web服务就是典型的应用
说多了没用,让我们来一段代码吧
先定义一个类
1
using System;
2
3
namespace SerializTest
4

{
5
[Serializable]
6
public class Class2
7
{
8
private string name;
9
[NonSerialized]
10
private int account;
11
12
public Class2(string name,int account)
13
{
14
this.account=account;
15
this.name=name;
16
}
17
18
public int Account
19
{
20
get
21
{
22
return account;
23
}
24
}
25
26
public string Name
27
{
28
get
29
{
30
return name;
31
}
32
}
33
}
34
}
35
说明:
序列化一个类的最简单的方式是使用Serializable属性
当然还可以通过在对象上实现ISerializable接口,自定义序列化
标记了Serializable属性的类,类里面的所有成员都将被序列化,私有的变量也在内
当然我们也可以有选择的序列化类里面的字段
例如类里面的一些敏感数据,我们可以不对其进行序列化
通过用NonSerialized属性标记成员变量,可以防止它们被序列化
NonSerialized属性只可以用在类的某个字段上
好了,再来一段俺喜欢的控制台来看看到底是怎么回事
1
using System;
2
using System.IO;
3
using System.Runtime.Serialization;
4
using System.Runtime.Serialization.Formatters.Binary;
5
using System.Runtime.Serialization.Formatters.Soap;
6
7
namespace SerializTest
8

{
9
class Class1
10
{
11
[STAThread]
12
static void Main(string[] args)
13
{
14
string fileName="MyFile.dat";
15
Class2 my=new Class2("Serializ TestSerializ",987);
16
Console.WriteLine("初始化Class2类的一个实例my,my的账号=987,my的名字=Serializ TestSerializ");
17
18
//序列化过程开始,我们把Class2的实例二进制序列化到文件MyFile.dat中
19
IFormatter formatter1=new BinaryFormatter();
20
Stream stream1 = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.None);
21
formatter1.Serialize(stream1,my);
22
stream1 .Close();
23
24
//反序列化过程开始,我们把Class2的实例从文件MyFile.dat中取出来
25
IFormatter formatter = new BinaryFormatter();
26
Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
27
Class2 c2 = (Class2) formatter.Deserialize(stream);
28
stream.Close();
29
30
Console.WriteLine("c2的名字="+ c2.Name );
31
Console.WriteLine("c2的账号="+ c2.Account.ToString() );
32
33
Console.ReadLine();
34
}
35
}
36
}
结果是

我们可以看到由于类Class2的account字段运用了NonSerialized属性
反序列化后我们是看不到Class2类实例的账号,只能看到名字
让我们再看一段,同时序列化多个对象的代码
1
using System;
2
using System.IO;
3
using System.Runtime.Serialization;
4
using System.Runtime.Serialization.Formatters.Binary;
5
using System.Runtime.Serialization.Formatters.Soap;
6
7
namespace SerializTest
8

{
9
class Class1
10
{
11
[STAThread]
12
static void Main(string[] args)
13
{
14
string fileName="MyFile.dat";
15
Class2[] myClass=
{new Class2("a",123),new Class2("b",456),new Class2("c",789)};
16
17
//序列化过程开始
18
//我们把类的几个实例序列化到一个文件中,这样比起分别序列化可以节约空间
19
IFormatter formatter=new BinaryFormatter();
20
Stream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.None);
21
for(int i=0;i<myClass.Length;i++)
22
{
23
formatter.Serialize(stream,myClass[i]);
24
}
25
stream.Close();
26
27
//反序列化过程开始
28
IFormatter formatter11=new BinaryFormatter();
29
Stream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,FileShare.Read);
30
long ii= fs.Length;
31
System.Collections.ArrayList list=new System.Collections.ArrayList();
32
//从文件中逐个读出Class2的实例并反序列化
33
while (fs.Position!=fs.Length)
34
{
35
list.Add(formatter11.Deserialize(fs));
36
}
37
fs.Close();
38
Console.WriteLine("反序列化结果:");
39
foreach(object o in list)
40
{
41
Class2 class2=o as Class2;
42
if (class2!=null)
43
{
44
Console.WriteLine("名字="+ class2.Name );
45
Console.WriteLine("账号="+ class2.Account.ToString());
46
}
47
}
48
49
Console.ReadLine();
50
}
51
}
52
}
结果是

其实数组也是可以序列化的类
那么我们可以把上面的代码做些简化
1
using System;
2
using System.IO;
3
using System.Runtime.Serialization;
4
using System.Runtime.Serialization.Formatters.Binary;
5
using System.Runtime.Serialization.Formatters.Soap;
6
7
namespace SerializTest
8

{
9
class Class1
10
{
11
[STAThread]
12
static void Main(string[] args)
13
{
14
分享到:
相关推荐
MCAD可快速绘制平面机构运动简图,并运动分析、仿真和设计.建一个模型仅需用几十秒到几分钟,比用商业CAD软件建模更简单、快捷,且可重复使用调整。可供从事机械的工程师、学生、教师使用.(若不是CSDN用户,请尽可能...
MCAD (Microsoft Certified Application Developer) 和 MCSD (Microsoft Certified Solutions Developer) 是微软为专业人士推出的两项重要认证,旨在验证他们在使用Visual C# .NET进行应用程序开发和解决方案构建...
技术指标MCAD是技术分析中常用的指标之一,它可以帮助投资者捕捉股票的涨跌趋势和买卖点。MCAD指标是基于MACD(Moving Average Convergence Divergence)指标,它通过计算股票的快慢均线的差异来预测股票的涨跌趋势...
综上所述,MCAD的开发旨在解决现有二维绘图软件存在的诸多不足,通过精心设计的数据结构和模块化功能,提供一个更适合机械设计需求的绘图环境。MCAD软件通过简化设计、增强交互性和易用性、提升开放性和可扩展性,为...
在电子产品的设计和开发过程中,ECAD和MCAD之间的集成对于整个产品的设计流程至关重要,能够使电子设计和机械设计之间的协同工作更加高效。 Altium公司通过与DesktopEDA公司的合作,旨在进一步提升PCB设计软件...
13. **XML和JSON**:掌握数据交换格式XML和JSON的处理,包括解析和序列化。 14. **设计模式**:熟悉常见的设计模式,如单例、工厂、观察者等,并能在项目中应用。 15. **.NET框架的安全性**:理解代码访问安全性和...
.NET 认证MCAD70-305实战百题详解 清华大学出版社 美国微软工程师张玉石编著。
MCAD( Metropolitan Air Quality Simulation System)是一个基于质量守恒原理和对流扩散方程的开源软件,专为城市大气污染模型设计。这个系统允许科学家、工程师以及政策制定者分析空气质量,评估不同情景下的污染...
在当今高度集成的产品设计环境中,ECAD(电子计算机辅助设计)和MCAD(机械计算机辅助设计)的界限日益模糊,设计团队间的沟通成为产品开发的关键环节。文章作者Pawel Z. Chadzynski探讨了这一主题,强调了跨领域...
随着电子产品的小型化、智能化和互联性的提升,两者的协同设计变得至关重要。 一体化设计的概念应运而生,旨在打破MCAD和ECAD之间的界限,实现两者之间的无缝协作。这不仅涉及尺寸和布局的同步,还包括功能和用户...
随着技术的快速发展,特别是5G技术的应用以及物联网(IoT)设备的普及,电子产品正朝着更加定制化和个性化的方向发展。这些趋势对PCB(Printed Circuit Board,印刷电路板)的设计和制造提出了新的挑战。 1. **5G的影响...
MCAD MCSD CSharp Certification All in One Exam Guide MCAD MCSD CSharp Certification All in One Exam Guide MCAD MCSD CSharp Certification All in One Exam Guide
MCAD-MCSD Self-Paced Training Kit305&315 MCAD-MCSD Self-Paced Training Kit305&315 MCAD-MCSD Self-Paced Training Kit305&315 MCAD-MCSD Self-Paced Training Kit305&315
MCAD-MCSD Self-Paced Training Kit306&316 MCAD-MCSD Self-Paced Training Kit306&316 MCAD-MCSD Self-Paced Training Kit306&316
在当今全球市场上,需要在更短时间内设计出更小、更智能产品的压力使得设计工程师必须不断重新评估和修改从概念一直到制造的整体产品设计流程。 电子技术的快速发展进一步推动了对变革的需求,一系列的革新进程...
"Solution"文件可能包含了一些示例项目的源代码,供读者实践和学习。通过实际操作,可以加深对XML Web服务开发的理解,包括服务的创建、调试、测试以及客户端的调用。 10. **最佳实践** 开发XML Web服务时,应...
Visual Basic® .NET and Microsoft Visual C#® .NET MCAD/MCSD Self-Paced Training Kit: Developing Windows®-Based Applications with Microsoft® Visual Basic® .NET and Microsoft Visual C#® .NET, ...
1. 产品设计数据交换交流:JT格式的轻量化和开放性使得其成为产品设计数据交换交流的理想选择。 2. 三维模型查看和编辑:JT2Go软件可以快速、高效地查看和编辑三维模型数据。 3. 数据分析和检测:JT2Go软件的PMI功能...
解析“多CAD设计环境”——访PTC公司中国区MCAD技术经理钱伟勋.pdf
2. 参数化设计可以分为基于特征的参数化设计、基于草图的参数化设计和基于装配的参数化设计等多种类型。 3. UG软件中的参数化设计可以使用Excel表格来实现。 4. UG软件的建模与参数化技术分析可以应用于各种工业...