关于C#中的序列化与反序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;
using System.Xml.Serialization;
namespace TestDeserialization
{
public class MainClass
{
public MainClass()
{
Initialize();//1
}
private void Initialize()
{
cl1 = new Class1();
cl2 = new Class2();
}
[DataMember(IsRequired = true, EmitDefaultValue = true, Order = 0)]
public Class1 CL1
{
get
{
return cl1;
}
set
{
cl1 = value;
if (cl1 == null)
{
cl1 = new Class1();
}
}
}
[DataMember(IsRequired = true, EmitDefaultValue = true, Order = 1)]
public Class2 CL2
{
get
{
return cl2;
}
set
{
cl2 = value;
if (cl2 == null)
{
cl2 = new Class2();
}
}
}
private Class1 cl1;
private Class2 cl2;
[OnDeserializing()]
public void Initialize(StreamingContext context)
{
Initialize();//4
}
}
public class Class1
{
public Class1()
{
Initialize();//2//5//7
}
private void Initialize()
{
num1 = 1;
bl1 = true;
}
[DataMember(IsRequired = true, EmitDefaultValue = true, Order = 0)]
public int NUM1
{
get
{
return num1;
}
set
{
num1 = value;
}
}
[DataMember(IsRequired = true, EmitDefaultValue = true, Order = 1)]
public bool BL1
{
get
{
return bl1;
}
set
{
bl1 = value;
}
}
private int num1;
private bool bl1;
[OnDeserializing()]
public void Initialize(StreamingContext context)
{
Console.WriteLine(num1);//8
Console.WriteLine(bl1);
}
}
public class Class2
{
public Class2()
{
Initialize();//3//6//9
}
private void Initialize()
{
num2 = 2;
str2 = "Class2string";
}
[DataMember(IsRequired = true, EmitDefaultValue = true, Order = 0)]
public int NUM2
{
get
{
return num2;
}
set
{
num2 = value;
}
}
[DataMember(IsRequired = true, EmitDefaultValue = true, Order = 1)]
public string STR2
{
get
{
return str2;
}
set
{
str2 = value;
}
}
private int num2;
private string str2;
[OnDeserializing()]
public void Initialize(StreamingContext context)
{
Console.WriteLine(num2);//10
Console.WriteLine(str2);
}
}
class Program
{
static void Main(string[] args)
{
string filePath = "d:\\xmlInfo.xml";
//MainClass cls = new MainClass();
//Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite);
//XmlWriterSettings settings = new XmlWriterSettings();
//settings.Encoding = System.Text.Encoding.UTF8;
//settings.Indent = true;
//settings.CloseOutput = true;
//XmlWriter writer = XmlDictionaryWriter.Create(ostrm, settings);
//DataContractSerializer serializer = new DataContractSerializer(cls.GetType());
//serializer.WriteObject(writer, cls);
//writer.Close();
FileInfo file = new System.IO.FileInfo(filePath);
XmlTextReader reader = new XmlTextReader(file.Open(FileMode.Open, FileAccess.Read));
DataContractSerializer serializer1 = new DataContractSerializer(typeof(MainClass));
MainClass mcls;
mcls = serializer1.ReadObject(reader, false) as MainClass;
Console.ReadLine();
}
}
}
上面注释掉的代码为生成文件的,文件生成后我就注释掉了。
文件如下:
<?xml version="1.0" encoding="utf-8"?>
<MainClass xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TestDeserialization">
<CL1>
<BL1>true</BL1>
<NUM1>1</NUM1>
</CL1>
<CL2>
<NUM2>2</NUM2>
<STR2>Class2string</STR2>
</CL2>
</MainClass>
Initialize函数后面的数字代表执行顺序。不太明白的是在执行这一步时
mcls = serializer1.ReadObject(reader, false) as MainClass;
先调用MainClass的构造函数,此时Class1与Class2的构造函数先后执行。
再调用MainClass的反序列化函数,此时Class1与Class2的构造函数先后执行。
接下来就有问题了:
Class1与Class2的构造函数又执行了一遍后,才进行了两个类的反序列化函数,这是为什么呢?
也就是说反序列化一个类的时候是一定会先执行一遍该类构造函数才执行反序列化函数么?
相关推荐
C# 序列化与反序列化
在 C# 编程中,序列化和反序列化是非常重要的概念。序列化是将对象转换为可以存储或传输的格式的过程,而反序列化则是将存储或传输的格式转换回对象的过程。这两个过程在许多应用场景中都非常有用,例如保存对象状态、在网络上传输对象、在不同的应用程序之间共享数据等。序列化和反序列化是 C# 编程中非常重要的概念,可以方便地进行数据存储、网络传输和数据共享等操作。在 C# 中,可以使用二进制序列化、XML 序列化和 JSON 序列化等方式进行序列化和反序列化。
掌握C#的序列化与反序列化技术
在数据处理和通信领域,序列化和反序列化是两个基础且重要的概念。序列化是将对象的状态信息转换为可以存储或传输的形式的过程。这种过程常用于在进程间或网络间传递数据,或是为了持久化数据到文件系统中。简而言之,序列化使得数据结构能够在不同的环境中被存储和传输。.NET框架为开发者提供了内置的序列化机制,它允许开发者将对象状态存储到媒介中,如文件或内存流,并能在需要时重新构建对象。这一过程的关键是使对象能够在不同的上下文中保持状态一致,即使是在应用程序关闭后重新启动的情况下也能恢复对象的状态。
C# 中的序列化与反序列化深入解析
在 C# 中,序列化指的是将对象的状态信息转换为可以存储或传输的格式的过程。常见的格式包括 XML、JSON 和二进制等。序列化后的数据可以被保存到文件中,或者通过网络发送到远程计算机。反序列化则是序列化的逆过程,指的是将之前序列化存储或传输的数据重新转换成对象的过程。在深入探讨自定义序列化类的实现细节之前,先概述本章节所涵盖的内容。本章会围绕自定义序列化类的开发过程,详细地讨论其设计原则和实现细节。首先,3.1节将从面向对象的原则和设计模式两个维度探讨自定义序列化类的设计思想。
C# 中的序列化与反序列化实践指南
序列化(Serialization)是将对象状态转换为可存储或传输的格式的过程。在C#中,这通常意味着将对象转换为XML、JSON或二进制数据流。反序列化(Deserialization)则是将这些数据流转换回原始对象的过程。这个机制是数据持久化、远程通信和缓存等众多应用场景的基础。为了控制如何序列化对象的特定成员,.NET提供了属性(Attribute)机制。通过应用特定的属性,可以自定义序列化过程中成员的处理方式。例如,可以使用来自定义元素的名称,使用来将成员表示为属性等。set;
29Linux基础命令详解——用户管理.docx
29Linux基础命令详解——用户管理


