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

WCF DataContracts 中的 JSON 序列化和反序列化

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (10投票s)

2009年6月8日

CPOL

3分钟阅读

viewsIcon

100214

说明如何在 WCF DataContracts 中使用 JSON 序列化和反序列化。

引言

随着 XML 逐渐不再是进程间通信和互联网基础设施上数据交换的首选,JSON 越来越受欢迎,因为它能更快更好地打包数据。具体来说,随着使用 AJAX 的 Web 服务动态交换数据,从而需要部分呈现网页的需求日益增长,JSON 已成为客户端调用和服务器进程之间进行通信的更紧凑、更简单的方式,从而提供丰富的用户体验。此外,Windows Communication Foundation (WCF) 使用 JSON 数据和 XML 信息集之间的内部、隐藏映射来处理 JSON 消息以进行数据交换。

本文讨论 JSON 的特性,以及如何通过示例手动执行简单的 JSON 数据序列化。

JavaScript 对象表示法

JSON(JavaScript 对象表示法)是一种高效的数据编码格式,可以在客户端浏览器和服务器组件之间快速交换少量数据。 JSON 使用 JavaScript 对象文字的子集来编码数据。

JSON 和 XML

在 WCF 服务和支持 AJAX 的 Web 服务中,JSON 编码已成为替代 XML 进行数据和消息交换的更好选择。通常,XML 元素在序列化时会映射到 JSON 字符串,但了解 XML 的其他部分如何序列化会很有意思。

如何序列化/反序列化 JSON 数据?

目前,在 .NET Framework 3.5 中,JSON 序列化和反序列化是在 WCF 和支持 AJAX 的 Web 服务中实现的。 JSON 保留了二进制、SOAP 和 XML 等其他形式的序列化技术,是新近包含在框架中的,当您在通过支持 AJAX 的端点公开的服务操作中使用数据协定类型时,它由 Windows Communication Foundation (WCF) 自动处理。

JSON 序列化是将 .NET 类型对象序列化为 JSON 编码的数据,广泛用于编写异步 JavaScript 和 XML (AJAX) 风格 Web 应用程序的情况。 Windows Communication Foundation (WCF) 中的 AJAX 支持通过 ScriptManager 控件针对 ASP.NET AJAX 的使用进行了优化。

JSON 反序列化是将 JSON 数据反序列化为 .NET Framework 类型和对象的实例,以便在客户端工作。

如果您需要直接使用 JSON 数据,则使用 DataContractJsonSerializer 类,它充当序列化引擎,将 JSON 数据转换为 .NET Framework 类型的实例,然后再转换回 JSON 数据。需要序列化的 .NET 对象必须附加 DataContract 属性,并且其成员必须附加 DataMember 属性。

DataContractJsonSerializer 类包含一个 WriteObject 方法,用于将特定对象序列化为 JSON 数据,并将结果数据写入流。 ReadObject 方法读取 JSON 格式的文档流,并返回反序列化的对象。但是,此类目前存在一个较大的限制,即 DataContract 类的多个成员(字段、方法等)无法序列化。

这是一个示例应用程序,显示了如何序列化和反序列化 JSON 数据。 请注意,DataContractJsonSerializer 类可以独立工作,而无需您的应用程序的 WCF 配置。 这有助于我们手动序列化和反序列化数据。

示例应用程序

  1. 创建一个名为 *JSONConsole* 的控制台应用程序,并添加一个新类文件 *Person.cs*。
  2. using System.Runtime.Serialization;
    
    namespace JSONConsole
    {
        [DataContract]
        internal class Person
        {
            [DataMember]
            internal string name;
            [DataMember]
            internal int age;
        }
  3. 将程序集 *System.ServiceModel.Web* 和 *System.Runtime.Serialization* 的引用添加到项目中。
  4. 在 *program.cs* 代码文件中,在 Main 方法中编写以下内容
  5. using System.IO;
    using System.Runtime.Serialization.Json;
    namespace JSONConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                Person p = new Person();
                p.name = "Bala";
                p.age = 22;
                MemoryStream stream1 = new MemoryStream();
                DataContractJsonSerializer ser = 
                  new DataContractJsonSerializer(typeof(Person));
                ser.WriteObject(stream1, p);
                stream1.Position = 0;
                StreamReader sr = new StreamReader(stream1);
                Console.Write("JSON serialized Person object: ");
                Console.WriteLine(sr.ReadToEnd());
                 
            }

    请注意,由于在 WCF 和 AJAX 相关服务中使用了 DataContractJsonSerializer 类,因此命名空间 System.Runtime.Serialization.Json 可以在 System.ServiceModel.Web 中找到。

  6. 构建应用程序,并在控制台窗口中查看如下所示的序列化结果
  7. JSON serialized Person object: {"age":22,"name":"Bala"}.
  8. 现在,对于反序列化,请在主方法中添加以下代码
  9. stream1.Position = 0;
    Person p2 = (Person)ser.ReadObject(stream1);
    Console.WriteLine("Deserialized Person data:");
    Console.WriteLine("Name: " + p2.name);
    Console.Write("age=");
    Console.WriteLine(p2.age);
  10. 再次构建应用程序,并查看反序列化的结果
  11. 输出

    Deserialized Person data:
    Name: Bala
    age=22

结论

本文介绍了 .NET Framework 3.5 中引入的新编码格式 JavaScript 对象表示法 (JSON),它可以在客户端应用程序和服务器之间执行更快的数据交换。 它还介绍了如何在 WCF 服务中执行 .NET 对象到 JSON 编码的序列化和反序列化。

© . All rights reserved.