65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义序列化 -第一部分

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.87/5 (5投票s)

2008年2月20日

CPOL

4分钟阅读

viewsIcon

39414

downloadIcon

255

在软件世界中,序列化和反序列化非常重要。您应该能够将内存中的数据保存到持久存储中以便以后检索,或者您可能希望与其他软件/框架/系统/平台共享数据。

引言

序列化和反序列化在软件世界中至关重要。您应该能够将内存中的数据保存到持久存储中以便以后检索,或者您可能希望与其他软件/框架/系统/平台共享数据。在本系列文章中,我将带您了解 .NET 世界中序列化的简单到高级功能。

序列化与反序列化

为了建立背景,让我们先定义术语。序列化是将对象转换为字节流的过程,该字节流可以传输到另一个层或系统。反序列化是将字节流转换为本机对象的过程,以便下游业务流程可以使用它。如果您的应用程序涉及需要持久化以供将来使用,或者需要被其他技术(例如 Java 服务)使用的自定义业务实体等,那么在发送之前需要对这些实体进行序列化,并在从外部系统接收后进行反序列化。在 .NET 中,当您创建一个具有公共属性的类时,该类的实例将由 .NET Framework 自动序列化/反序列化。

在本系列文章中,我们将深入探讨序列化,了解它是如何工作的,以及我们如何实现自己的序列化机制。为了建立背景并让大家轻松上手,我将从一个简单的示例开始。我建议参考本文附带的示例代码来完全理解它。

逻辑架构

下图显示了示例应用程序的逻辑架构

CustomSerializationPart1-Code

该系统由一个业务实体(在本例中为具有四个字段的 `Customer`)和一个业务逻辑层(Customer BLL)组成。两者都构建在单独的程序集中。我有一个 Windows 客户端应用程序,它使用该实体并消耗业务逻辑层。该应用程序只是创建一个客户实体,从控件中填充数据,然后使用业务逻辑层对其进行验证。

进程内模式

直接从 Windows 客户端应用程序使用业务逻辑层并不奇怪。该对象在 Windows 应用程序的进程中创建,驻留在其中,系统能够对其进行消耗和使用。这种情况在 Windows 客户端应用程序的“进程内模式”中有所体现。

跨越边界/跨进程

我还开发了一个 Web 服务项目,该项目封装了业务逻辑层类。该层通过 Web 服务公开 BLL。请记住,BLL 具有接受和返回 `Customer` 作为参数的方法。当我们将它公开为 Web 服务时,类型会作为 WSDL 的一部分被公开。因此,当您查询 WSDL(键入 *websitehomepage/webservicename.asmx?wsdl*)时,您会看到 `Customer` 作为复杂类型,其属性作为定义了类型的元素。

Windows 客户端应用程序有一个名为“使用 Web 服务代理”的另一个组,其中通过 Web 服务代理进行调用。该应用程序运行良好,它能够创建 `Customer` 对象并使用 Web 服务对其进行验证。当数据通过 Web 服务传输时,它们使用 XML 格式。问题在于 `Customer` 对象是如何转换为 XML 的,以及谁来做?我们从未编写过任何代码来将对象转换为 XML 或反之。事实上,这是由 .NET Framework 本身完成的。

框架查看类的公共属性,并使用 `XmlSerializer` 将它们转换为 XML 格式——这称为序列化。

当它被另一个 .NET 应用程序使用时,.NET 框架会自动将 XML 流转换为 .NET 对象——这称为反序列化。这是一个两步过程。当您使用 *WSDL.exe* 或通过 VS 添加 Web 引用选项创建 Web 服务代理时,该工具将生成一个代理类来消耗 Web 服务,并且还会通过查看 WSDL 复杂类型来创建实体类。因此,完成后,您将看到 `CustomerService` 类,它是您的代理类,然后是 `Customer` 类,它是您的实体类。

当您通过 `CustomerService` 代理类调用 Web 服务时,它会接受并返回作为代理类一部分创建的 `Customer` 实例。当您查看生成的 WSDL 代理代码时,这一点就很明显了。请参阅 Web 引用-> CustomerBLLWSServiceProxy 文件夹内的 *Reference.cs*。

WinClient.JPG

代码工作原理

下载包含以下 C# 项目

  • BusinessEntities – 包含带有公共字段的 `Customer` 类。
  • BusinessLogicLayer – 对业务实体执行业务逻辑。
  • BLLWebService – 将业务逻辑层公开为 Web 服务的 Web 服务项目。
  • WinClient – 消耗业务逻辑层(进程内场景)和 BLL Web 服务(进程外、跨平台场景)的 Windows Forms 客户端应用程序。进程内模式验证按钮调用业务逻辑层。在这种情况下,不会有序列化或反序列化过程。Web 服务模式验证按钮调用 Web 服务。它首先调用 `NewCustomer()` 方法,获取 `Customer` 实例,填充数据,然后调用 `ValidateCustomer()` Web 服务方法。这次,它传递填充的 `Customer` 实例。它创建的 `Customer` 实例将是代理生成的类,而不是来自 BusinessEntities 程序集的类。

这是一篇关于序列化和反序列化过程的入门文章。在下一篇文章中,我们将深入探讨序列化过程。

阅读愉快,编码愉快!

© . All rights reserved.