什么是对象序列化和反序列化?
与普通技术(如读取对象的属性,然后将DataRow的列填充到它们中,最后将DataRow保存在DB中)相比,序列化有何不同之处?
什么是对象序列化和反序列化?
与普通技术(如读取对象的属性,然后将DataRow的列填充到它们中,最后将DataRow保存在DB中)相比,序列化有何不同之处?
序列化通常是指创建数据的版本(而不是对象),该版本可以用于存储(例如在文件中),在网络上传输,或者仅在单台计算机上在进程 / AppDomain /等之间传输。
序列化通常意味着将数据编写为字符串(比如:xml / json)或原始二进制格式(例如:byte[]
等)。反序列化是相反的过程;它会获取原始数据(来自文件,来自传入的网络套接字等),并重新构建对象模型。
与使用数据库的区别在于,它没有固有的表格布局,也没有真正的绑定到数据库;数据可以是任何形状,并且倾向于更接近面向对象的布局,而不是表格的行/列性质。
大多数平台都有一系列序列化工具。例如,听起来您正在谈论.NET-因此BinaryFormatter
(.NET特定),XmlSerializer
,DataContractSerializer
,Json.NET和protobuf-net / dotnet-protobufs都符合要求。
序列化通常是将运行时对象的状态写入磁盘(但可以是任何地方),并能够再次读取的过程。
有效地,将对象的属性存储到表中是一种序列化形式。
在.NET中,还有其他形式:
您也可以自己创建。
但总的来说,如果您正在将对象的状态保存在某个地方,然后将其重新读取到运行时中的“活动”对象中,则正在对其进行序列化。
序列化
序列化是将一个对象或一组对象图转换为流的过程。
反序列化
反序列化是将流转换回对象或一组对象图的过程。
以下是一些自定义属性:
[OnDeserialization] -> 当我们需要在流的反序列化期间执行某些操作时使用。 [OnDeserialized] -> 当我们需要在将流反序列化为对象后执行某些操作时使用,例如正确设置对象的字段值。
以下是示例
[Serializable]
internal class DemoForSerializableAndDeserializable
{
internal string Fname = string.Empty;
internal string Lname = string.Empty;
internal Stream SerializeToMS(DemoForSerializableAndDeserializable objDemo)
{
DemoForSerializableAndDeserializable objSer = new DemoForSerializableAndDeserializable();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, objSer);
return ms;
}
[OnDeserializing]
private void OnDeserializing(StreamingContext context)
{
// Do some work while deserializing the stream
}
[OnDeserialized]
private void OnSerialized(StreamingContext context)
{
Fname = "abc";
}
}
调用代码
class CallingCode
{
string fname = string.Empty;
string Lname = string.Empty;
static void Main(string[] args)
{
DemoForSerializableAndDeserializable demo = new DemoForSerializableAndDeserializable();
Stream ms = demo.SerializeToMS(demo);
ms.Position = 0;
DemoForSerializableAndDeserializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializableAndDeserializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}
}