学习C#中的序列化

114 阅读5分钟

C#中的序列化

序列化是将一个对象转换为字节流的过程,以存储该对象或将其传输到内存、数据库或文件。这在传输转换后的数据方面是很有好处的。

前提条件

  • 在你的机器上安装Visual Studio 2019。它是用于运行Csharp程序的IDE。
  • .NET 编程和XML文件方面的知识。

序列化的应用

序列化允许开发者保存一个对象的状态,并在以后需要时恢复它。序列化允许以下操作。

  • 通过HTTP协议将一个项目传递给远程应用程序。
  • 域与域之间的传输--一个JSON或XML数据字符串可以用来在防火墙上传输一个项目。
  • 在应用程序之间保持用户特定或安全相关的数据。

制作一个可序列化的对象

你将需要以下东西来序列化二进制或XML数据。

  • 可序列化的对象。
  • 一个包含序列化对象的流。
  • 一个System.Runtime.Serialization.Formatter 实例。

创建要使用的流和格式的实例,然后在格式上使用 Serialize 函数。这个函数接收两个字符串作为参数:流和要序列化的对象。

C# 序列化的作用

在使用应用程序时,我们必须将数据存储在耐用或非耐用的介质中,以便以后检索。序列化可能会有所帮助。在网络上传输一个对象时需要序列化。在C#中进行序列化,应用程序需要一个序列化命名空间。在C#中,我们利用Serializable 属性。

考虑一下下面的例子。

[Serializable] public class Examine //We added the serializable symbol to make this class serializable.
{
public int item;
public string identity;
}

要使任何主体不可序列化,使用NonSerialized 属性。例如,为了显示NonSerialized 属性,请考虑下面的示例类。

[Serializable] public class Examine //We added the serializable symbol to make this class serializable.
{
public int item;
public string identity;
[NonSerialized] Public double cost; //We added the non-serialized symbol to make this class non-serializable.
}

C#中的序列化类型

1.二进制序列化

System.Runtime.Serialization 是一个包括二进制序列化类的命名空间。在计算中,命名空间是用于识别和引用各种事物的符号的集合。命名空间确保一个集合中的所有对象都有唯一的、易于识别的名称。二进制编码为存储和基于套接字的网络流提供了一个直接的序列化。

通过二进制序列化,即使是只读成员也会被序列化,从而在速度上提高性能。这是将.NET对象转换为字节流的方法。在二进制序列化过程中,所有的公共、私有和只读成员都被处理。二进制序列化是用来快速将项目转换为字节的。它利用了System.Runtime.Serialization.Formatters.Binary 引用。

下面是一个二进制序列化的例子。

using System;
using System.Linq;
using System.IO;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;

namespace Demo
{
    [Serializable] //We added the serializable symbol to make this class serializable.
    class Test
    {
        public int  identification;
        public String denot;
        static void Main(string[] args)
        {
        Test ob = new Test();
        ob. identification = 10;
        ob.denot = "Erick";

        IFormatter format = new BinaryFormatter();
            Stream stream1 = new FileStream(@"D:\demo.txt", FileMode.Create,FileAccess.Write);
            format.Serialize(stream1, ob);
            stream1.Close();
            stream1 = new FileStream(@"D:\demo.txt", FileMode.Open, FileAccess.Read);
            Check ob1 = (Check)format.Deserialize(stream1);
            Console.WriteLine(ob1. identification);
            Console.WriteLine(ob1.denot);
            Console.ReadKey();
        }
    }
}

如果二进制序列化做得不正确,会有安全问题。详细信息可以在BinaryFormatter 安全文档中找到。

2.XML序列化

一个类实例的公共成员可以被序列化为一个XML流。串行化XML比串行化二进制文件需要更长的时间。XML序列化被用来实现跨平台的兼容性。序列化的XML是文本的。XML文件很容易阅读和编辑。XmlAttribute提供了一个接受XML的序列化属性。

XmlSerializer类使用XML序列化标准来序列化一个对象。下面是一个如何使用XmlSerializer的例子。

XmlSerializer Serializer = new XmlSerializer(typeof(Push));
using (TextWriter Writer = new StreamWriter(@"c:\xmlseeralizer.xml"))
{
xmlSerializer.Serialize(Writer, pushObject);
}

3.SOAP序列化

简单对象访问协议(SOAP)是一种基于XML的计算机间数据传输协议,并为网络服务提供传输机制。SOAP是一种语言,与平台无关。

SOAP序列化被用来将由不兼容的设计组成的项目从一个应用程序转移到另一个。

Serializable告诉.NET运行时,这个类的实例可以被序列化。这个属性对于类级的序列化是必需的。例如,在我们的Program.cs 类的Main() 函数中,我们将利用SoapFormatter将我们的样本对象的实例序列化为一个Soap XML流。

示例程序。

// For SOAP serialization to occur, one must reference the SOAP serialization using System.Runtime.Serialization.Formatters.Soap;

using system;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Soap;

namespace soapSerializationSample
{
    class demo
    {
        static void Main(string[]args)
        {
            Sample sample = new Sample();
            sample.Name = "erick Kiragu"; // Instance of our sample class
            sample.Value =34;
            FileStream fileStream = new FileStream // This code is used to accept our output
            (@"d:\sem\serialisation.dat", FileMode.Create); // Serialization of the object
            SoapFormatter formatter = new  SoapFormatter();
            formatter.Serialize(fileStream, sample);
        }
    }
}

关键点

  • 在上面的代码中,我们创建了一个名为erick nyaga 的样本类的实例。然后我们使用值34将其序列化,之后我们使用FileStream fileStream = new FileStream(@"d:\sem\serialisation.dat", FileMode.Create) 创建了一个文件流来接受我们的输出。

  • SoapFormatter formatter = new SoapFormatter() 用来序列化创建的对象。

  • formatter.Serializa(fileStream, sample) 将对象序列化为 文件格式。.data

  • using System.Runtime.Serialization 和 是执行SOAP序列化的代码的参考。using System.Runtime.Serialization.Formatters.Soap

自定义序列化

自定义序列化允许事件序列化和去序列化。使用ISerializable 接口可能有帮助。自定义序列化允许你控制哪些项目被序列化以及如何序列化。需要SerializableAttributeISerializable接口。

考虑一下下面的代码,它演示了使用ISerializable 接口的自定义序列化。

[Serializable] public class Push : ISerializable
{
public virtual void GetObjectData(SerializationInfo information, StreamingContext context)
}

结论

在本教程中,我们涵盖了序列化对象的步骤、实现的序列化和各种类型的序列化。这些包括二进制序列化、XML序列化、SOAP序列化和自定义序列化。最后,我们用几个例子来表示这篇文章的结论。