序列化简言之是这样一种能力:能够把复杂的对象(Object)变成某种格式的字符串(常见的格式有xml,String,二进制文件等),这样可以方便的在各种系统中传输或交换(比喻socket编程中的数据包只能用byte[]传输),接收方得到该字符串后,通过反序列化可以还原为复杂对象,进而调用对象的方法或属性 -- 跟反射有点沾边:)
这里先给出一个WinForm的序列化例子,功能为通过打开文件对话框选择一个文件后,构造一个复杂对象,然后序列化为二进制格式,得到该格式后,再反序列化(还原)为复杂对象
Winform中的序列化
1
using
System;
2
System.IO;
3
System.Runtime.serialization;
4
System.Runtime.serialization.Formatters.binary;
5
System.Text;
6
System.Windows.Forms;
7
8
namespace
serializestudy
9
{
10
public
partial
class
Form1 : Form
11
{
12
Form1()
13
{
14
initializeComponent();
15
}
16
17
private
void
btnserialize_Click(
object
sender, EventArgs E)
18
19
OpenFileDialog opendlg
=
new
OpenFileDialog();
20
if
(opendlg.ShowDialog()
==
DialogResult.oK)
21
{
22
23
#region
得到一个包含"文件内容"的Msg对象
24
Msg msg
Msg();
25
msg.ReceiverName
"
jimmy
"
;
26
msg.SenderName
yjmyzy
27
msg.Type
messageType.file;
28
FileStream fs
opendlg.openFile()
as
FileStream;
29
msg.body
byte
[fs.Length];
30
fs.Read(msg.body,
0
, msg.body.Length);
31
fs.Close();
32
#endregion
33
34
将Msg对象序列到内存流中
35
MemoryStream ms
MemoryStream();
36
BinaryFormatter binaryFormatter
BinaryFormatter();
37
binaryFormatter.serialize(ms, msg);
38
39
40
再将内存流转化为byte[]
41
[] arrMsg
ms.ToArray();
42
ms.Close();
43
44
45
messageBox.Show(
序列化成功!
);
46
47
StringBuilder sb
StringBuilder();
48
49
for
(
int
i
; i
<
arrMsg.Length; i
++
)
50
{
51
sb.Append(arrMsg[i].ToString()
+
:12px; line-height:1.5; color:rgb(0,
52
}
53
54
textBox1.Text
sb.ToString().Trim(
'
'
55
}
56
57
58
btnDeserialize_Click(
59
60
(textBox1.Text.Trim().Length
) {
return
; }
61
62
先将textBox1中的内容变成byte[]
63
String
textBox1.Text.Trim().Split(
64
[] arrBin
[arrMsg.Length];
65
66
67
68
arrBin[i]
.Parse(arrMsg[i]);
69
70
71
72
try
73
74
IFormatter formatter
75
MemoryStream(arrBin);
76
formatter.Deserialize(ms)
Msg;
77
78
(msg
!=
null
79
80
messageBox.Show(
反序列化成功!
msg.ReceiverName
msg.SenderName
msg.TypE);
81
82
83
84
catch
(Exception eX)
85
86
messageBox.Show(ex.message.ToString());
87
88
89
}
90
91
92
93
///
<sumMary>
94
消息格式
95
</sumMary>
96
[serializable]
97
enum
messageType
98
99
txt,
100
img,128)">101
file,128)">102
unkNown
103
104
105
106
消息对象
107
108
109
Msg
110
111
messageType _type
messageType.unkNown;
112
messageType Type
113
114
set
{ _type
value; }
115
get
{
_type; }
116
117
118
SenderName {
;
119
receiverName {
120
[] Body {
121
122
123
}
124
不过在Silverlight中,传统的序列化方式有很多被精减掉了(比如BinaryFormatter之类),唯一得以保存的只剩下System.Xml.serialization,所以SL中只能通过xml来序列化对象(虽然xml序列化后的字节数相对Binary有点大,不过我们也别无选择),另外有一点很让人不习惯的是,需要序列化的自定义类中,居然不需要加[serializable],[DataMember]这类标记!(这一点让我郁闷了好久,还为此在网上疯狂的百度,google为啥sl中不识别serializable)
1.先定义一个需要序列化的类
@H_601_
696@
自定义类
2.序列化/反序列化代码示例:
Xaml部分:
Xaml
<
UserControl
x:Class
="serializeDemo.MainPage"
xmlns
="http://scheR_497_11845@as.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://scheR_497_11845@as.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://scheR_497_11845@as.microsoft.com/expression/blend/2008"
xmlns:mc
="http://scheR_497_11845@as.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable
="d"
d:DesignWidth
="640"
d:DesignHeight
="480"
>
Grid
x:Name
="LayoutRoot"
Grid.RowDeFinitions
RowDeFinition
Height
="30"
/>
="*"
</
StackPanel
HorizontalAlignment
="Center"
Orientation
="Horizontal"
Button
="btnserialize"
Content
="序列化"
Width
="80"
Height
="24"
Click
="btnserialize_Click"
="btnDeserialize"
="反序列化"
Margin
="10,0"
="btnDeserialize_Click"
StackPanel
TextBox
Grid.Row
="1"
text
="TextBox"
textwrapping
="Wrap"
d:LayoutOverrides
="Height"
x:Name
="txtResult"
Grid
UserControl
>
Xaml.cs部分:
@H_601_
696@Xam
l.cs
using
System;
System.IO;
System.Text;
System.Windows;
System.Windows.Controls;
System.Xml.serialization;
serializeDemo
{
partial
MainPage : UserControl
{
MainPage()
{
initializeComponent();
}
private
void
btnserialize_Click(
object
:12px; line-height:1.5; color:rgb(0, routedEventArgs E)
{
#region
得到一个复杂对象
Chatmessage msg
=
new
Chatmessage();
msg.ReceiverName
"
jimmy
"
;
msg.SenderName
yjmyzy
;
msg.Type
Chatmessage.messageType.file;
msg.body
[] {
0
:12px; line-height:1.5; color:rgb(0,
1
};
#endregion
MemoryStream ms
MemoryStream();
Xmlserializer xml
Xmlserializer(
typeof
(ChatmessagE));
try
{
xml.serialize(ms, msg);
//
将对象序列化为流
[] arr
ms.ToArray();
StringBuilder sb
StringBuilder();
for
(
int
i
; i
<
arr.Length; i
++
)
{
sb.Append(arr[i].ToString()
+
:12px; line-height:1.5; color:rgb(0,
);
}
txtResult.Text
sb.ToString().Trim(
'
'
);
}
catch
(Exception eX)
{
txtResult.Text
ex.message.ToString();
}
}
btnDeserialize_Click(
if
(txtResult.Text.Trim().Length
==
) {
return
; }
先将txtResult中的内容变成byte[]
[] arrMsg
txtResult.Text.Trim().Split(
);
[] arrBin
[arrMsg.Length];
arrMsg.Length; i
)
{
arrBin[i]
.Parse(arrMsg[i]);
}
MemoryStream ms
MemoryStream(arrBin);
Xmlserializer xml
{
Chatmessage msg
xml.Deserialize(ms)
as
Chatmessage;
反序列化为Chatmessage对象
(msg
!=
null
)
{
txtResult.Text
反序列化成功!
msg.ReceiverName
msg.SenderName
msg.Type.ToString();
}
}
ex.message.ToString();
}
}
}
}