C#序列化与反序列化(Serialize,Deserialize)实例详解

C#序列化与反序列化(Serialize,Deserialize)实例详解

序列化是什么?

序列化是将对象转换为字节序列的过程。在C# 中,可以使用序列化将指定的对象转换为 XML 或二进制格式的数据。

序列化的作用

序列化主要用于对象的持久化存储,网络通讯等领域。在对象的持久化存储中,可以将对象转换为二进制格式或 XML 格式的数据,存储在磁盘上。在网络通讯中,可以将对象转换为二进制格式或 XML 格式的数据,传输到网络中的其他计算机上。

C#中的序列化

在C# 中,可以使用 System.Runtime.Serialization 命名空间中的 DataContractSerializer 对象对对象进行序列化。使用序列化功能的步骤如下:

  1. 先定义一个需要序列化的类
[DataContract]
public class User
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Age { get; set; }

    [DataMember]
    public string Address { get; set; }
}

上述代码定义了一个 User 类,包含了 Name、Age、Address 三个属性,并使用了 DataContract 和 DataMember 属性进行标记。

  1. 使用 DataContractSerializer 对象进行序列化
using System.Runtime.Serialization;

public static string Serialize(object obj)
{
    string result = string.Empty;
    using (MemoryStream memoryStream = new MemoryStream())
    {
        DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
        serializer.WriteObject(memoryStream, obj);
        memoryStream.Position = 0;
        using (StreamReader streamReader = new StreamReader(memoryStream))
        {
            result = streamReader.ReadToEnd();
        }
    }
    return result;
}

上述代码演示了一个将对象序列化为 XML 字符串的示例。

  1. 使用 DataContractSerializer 对象进行反序列化
using System.Runtime.Serialization;

public static object Deserialize(string xml, Type type)
{
    object result = null;
    if (!string.IsNullOrEmpty(xml))
    {
        using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
        {
            DataContractSerializer serializer = new DataContractSerializer(type);
            result = serializer.ReadObject(memoryStream);
        }
    }
    return result;
}

上述代码演示了一个将 XML 字符串反序列化为对象的示例。

示例说明

示例1

// 定义一个 User 实例
User user = new User
{
    Name = "John",
    Age = 18,
    Address = "北京市海淀区"
};

// 序列化为 XML 字符串
string xml = Serialize(user);
Console.WriteLine(xml);

上述代码演示了如何将一个 User 对象序列化为 XML 字符串,并将结果打印出来:

<User xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SerializeDemo">
  <Address>北京市海淀区</Address>
  <Age>18</Age>
  <Name>John</Name>
</User>

示例2

// 反序列化为 User 实例
User user2 = Deserialize(xml, typeof(User)) as User;
Console.WriteLine("Name:{0}, Age:{1}, Address:{2}", user2.Name, user2.Age, user2.Address);

上述代码演示了如何将一个 XML 字符串反序列化为 User 对象,并打印对象的属性值:

Name:John, Age:18, Address:北京市海淀区

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#序列化与反序列化(Serialize,Deserialize)实例详解 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#中的事件介绍

    C#中的事件介绍 在C#中,事件是一种典型的观察者设计模式的应用。事件机制使得对象间的协作变得更加松散,同时也易于扩展。本篇文章将介绍C#中的事件,包括事件的定义、事件的注册和注销以及如何触发事件。 定义事件 在C#中,事件是一种特殊的委托,它定义了一个回调函数的集合。定义事件的方式是使用event关键字,语法如下: public event EventHa…

    C# 2023年5月31日
    00
  • C#在Entity Framework中实现事务回滚

    首先,在Entity Framework中,事务回滚是通过DbContext对象的Transaction属性和SaveChanges方法来实现的。 使用Transaction属性来开启和关闭事务,SaveChanges方法来提交对数据库的更改。如果在调用SaveChanges方法之前,对DbContext对象的Transaction属性调用了BeginTra…

    C# 2023年5月15日
    00
  • asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1)

    asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1) 在ASP.NET Core MVC中,我们可以使用全局过滤器来处理应用程序中的异常。其中,ExceptionFilter过滤器是一种常用的全局过滤器,用于处理应用程序中的异常。在本文中,我们将详细讲解ExceptionFilter过滤器的使用方法。 ExceptionF…

    C# 2023年5月16日
    00
  • C# 线程安全详解

    C#线程安全详解 什么是线程安全 线程安全指的是当多个线程同时访问同一个资源时,能够保证程序不会出现并发问题,不会导致数据的不一致或异常情况。 在 C# 中,线程安全一般涉及到以下几种情况: 多个线程同时访问同一个实例方法 多个线程同时访问静态方法 多个线程同时访问字段、属性或变量 线程安全的解决方法 为了保证线程安全,可以采用以下几种方法: 1.使用锁 锁…

    C# 2023年5月15日
    00
  • C#实战之备忘录的制作详解

    C#实战之备忘录的制作详解 简介 本文将介绍如何使用C#语言制作一个简单的备忘录,包括备忘录的基本功能、界面设计、代码实现等内容。 功能说明 本备忘录主要功能如下: 添加备忘录:用户可以通过界面向备忘录中添加新的备忘录。 查看备忘录:用户可以查看备忘录中已经添加的备忘录。 修改备忘录:用户可以修改备忘录中已经添加的备忘录。 删除备忘录:用户可以删除备忘录中已…

    C# 2023年6月1日
    00
  • C# Clone():创建并返回当前集合的副本

    当我们想要在C#中复制一个对象的数据而不是仅仅是引用时,可以使用Clone()方法。Clone()方法是从基类Object继承下来的,它返回当前实例的一份副本。 下面是使用Clone()时需要注意的几点要求: 被克隆的对象需要实现ICloneable接口,因为Clone()方法实际上是对ICloneable接口的实现。 Clone()方法返回的是Object…

    C# 2023年4月19日
    00
  • C#多线程编程中的锁系统(三)

    当多个线程同时访问共享资源时,可能会导致数据的不一致性,从而影响程序的正确性和稳定性。为了解决这个问题,我们可以使用锁系统来保证共享资源在同一时刻只能被一个线程访问和修改。 在C#多线程编程中,锁系统通常使用lock关键字来实现。下面是使用lock关键字来实现的示例代码: public class Counter { private static objec…

    C# 2023年6月7日
    00
  • .net实现oracle数据库中获取新插入数据的id的方法

    下面我为您提供在.NET中实现Oracle数据库中获取新插入数据的id方法的完整攻略: 1. 使用SEQUENCE序列 使用SEQUENCE序列是一种常见的获取新插入数据ID的方式。步骤如下: 首先在Oracle数据库中创建一个SEQUENCE序列:CREATE SEQUENCE seq_id START WITH 1 INCREMENT BY 1 MINV…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部