bet188地址化对象继承与JSON.NET

json logo i.e.博客帖子徽标

虽然由于过度使用过度的继承而经常皱起眉头仍然是一个强大的和(当正确使用时)面向对象的编程语言(如C#)的很大特征。但是,当它逐渐bet188地址化继承物体结构时,即在另一方面反向化它们的东西往往会受到毛茸茸的。该帖子将向您展示可以使用bet188地址化和bet188地址化相关对象的bet188地址化和解bet188地址化 JSON.NET..

所以让我们看看项目设置。服务器将是您的标准ASP.NET Web API RESTFUR Web服务,json.net出来的框。在客户端,我们将使用从便携式类库PCL消费服务,该PCL将能够使用大多数C#堆栈。 Windows Store,.NET,XAMARIN.IOS,XAMARIN.ANDROID等..我将使用Xamarin.forms应用程序,但代码将在您的WPF应用程序中运行很好。基本系统设置是客户端调用服务器进行数据,服务器返回bet188地址化的数据作为JSON,然后将在客户端上进行反bet188地址化,然后用于将信息显示给用户。

系统概述,显示通过客户端从客户端到服务器的通信流程,并通过JSONbet188地址化数据。

所以让我们看一下它如何更详细地工作。

设置项目

让我们从主要存在于控制器的服务器开始:

public class InheritanceController : ApiController{    // GET: api/Inheritance    public IEnumerable<ParentClass> Get()    {        return new ParentClass[] {new ParentClass(), new ChildClass()};    }}

控制器创建一个列表 parentclass.es和 儿童组织在将它们bet188地址化回呼叫者之前。

public class ParentClass{    public virtual string Title    {        get { return "Parent"; }    }    public virtual string Descirption    {        get { return "Hello from the parent."; }    }}public class ChildClass:ParentClass{    public override string Title    {        get { return "Child"; }    }    public override string Descirption    {        get { return "The child says hi..."; }    }    public string ChildSecret    {        get { return "42"; }    }}

所以在服务器端可以看到很多魔法。所以让我们看看客户。在PCL中,我们将使用HTTP客户端NuGet程序包调用服务器和JSON.NET包来将数据从服务器中进行反bet188地址化。

Nuget包概述在客户端上显示JSON.NET,Microsoft BCL构建组件,仅限MVVMlight库,Microsoft HTTP客户端库和Xamarin.Forms软件包

在客户端,我们将在列表中显示数据,您可以看到UI代码 mainPage.xaml.:

<?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http://xamarin.com/schemas/2014/forms"             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"             x:Class="InheritanceJsonSerialization.Client.Views.MainPage">  <Grid>    <ListView ItemsSource="{Binding DataItems}" ItemSelected="ListView_OnItemSelected" />    <ActivityIndicator IsRunning="{Binding IsLoading}" IsEnabled="{Binding IsLoading}" IsVisible="{Binding IsLoading}"/>  </Grid></ContentPage>

在里面 httphandler. 班上 getdata. 方法从服务器请求数据,然后进行反bet188地址化。

using System.Collections.Generic;using System.Net.Http;using System.Threading.Tasks;using InheritanceJsonSerialization.Client.Models;using Newtonsoft.Json;namespace InheritanceJsonSerialization.Client.Services.Http.Impl{    public class HttpHandler:IHttpHandler    {        private readonly HttpClient _httpClient;        public HttpHandler()        {            _httpClient = new HttpClient();        }        public async Task<IEnumerable<ParentClass>> GetData()        {            // Ensure that uri matches the service backend you are calling            //const string uri = "http://localhost:52890/api/inheritance";            const string uri = "//inheritancejsonserializationweb.azurewebsites.net/api/inheritance";            var httpResult = await _httpClient.GetAsync(uri);            var jsonContent = await httpResult.Content.ReadAsStringAsync();            var result = JsonConvert.DeserializeObject<IEnumerable<ParentClass>>(jsonContent);            return result;        }    }}

现在,当我们将客户端的信息反序时,我们运行到类型信息未传递给客户端的问题,因此反级化的所有对象都是类型 parentclass..

bet188地址化类型信息

练习json.net允许我们在bet188地址化类型时轻松地包含类型信息。在服务器上 登记 方法中的方法 webapiconfig 类我们可以设置Json.netbet188地址化对象的设置:

public static void Register(HttpConfiguration config){    // Web API configuration and services    config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All;    // Web API routes    config.MapHttpAttributeRoutes();    config.Routes.MapHttpRoute(        name: "DefaultApi",        routeTemplate: "api/{controller}/{id}",        defaults: new { id = RouteParameter.Optional }    );}

现在信息将在JSON字符串中bet188地址化:

{    "$type": "InheritanceJsonSerialization.Models.ParentClass[], InheritanceJsonSerialization",    "$values": [        {            "$type": "InheritanceJsonSerialization.Models.ParentClass, InheritanceJsonSerialization",            "Title": "Parent",            "Descirption": "Hello from the parent."        },        {            "$type": "InheritanceJsonSerialization.Models.ChildClass, InheritanceJsonSerialization",            "Title": "Child",            "Descirption": "The child says hi...",            "ChildSecret": "42"        }    ]}

在客户端,我们必须多次做更多的工作来获得反bet188地址化工作。

使用类型信息进行反bet188地址化

有关使用类型信息的反bet188地址化,您可能已经找到了将触发JSON.NET的以下代码行,以检查类型信息,并尝试根据JSON字符串中存在的信息反bet188地址化其。

JsonConvert.DeserializeObject<IEnumerable<ParentClass>>(jsonContent, new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All});

这里的问题是,当从相同的二进制/命名空间bet188地址化和反bet188地址化时,所有问题都会顺利,但在此设置中(我认为为公共设置),您将获得异常,因为不存在命名空间IE在客户端上不同而不是在服务器上。要解决此问题,我们必须编写一个继承的bet188地址化备率 defaultserializationbinder. as follows:

public class InheritanceSerializationBinder : defaultserializationbinder.{    public override Type BindToType(string assemblyName, string typeName)    {        switch (typeName)        {            case "InheritanceJsonSerialization.Models.ParentClass[]": return typeof(ParentClass[]);            case "InheritanceJsonSerialization.Models.ParentClass": return typeof(ParentClass);            case "InheritanceJsonSerialization.Models.ChildClass[]": return typeof(ChildClass[]);            case "InheritanceJsonSerialization.Models.ChildClass": return typeof(ChildClass);            default: return base.BindToType(assemblyName, typeName);        }    }}

这将简单地将服务器命名空间映射到本地类型。最后,我们可以更新 getdata. 方法中的方法 httphandler. class:

public async Task<IEnumerable<ParentClass>> GetData(){    // ...    var result = JsonConvert.DeserializeObject<IEnumerable<ParentClass>>(jsonContent, new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All, Binder = new InheritanceSerializationBinder()});    return result;}

现在,当我们将列表进行反bet188地址时 儿童组织 将正确地识别I.E。列表将通过反bet188地址化保留。

结论

在此帖子中,您可以使用JSON.NET在客户端上正确bet188地址化和反bet188地址化继承性的Hirarchies。通过这样做,我们必须配置我们的ASP.NET Web API并在客户端添加处理机制。我希望这篇文章有任何帮助,请告诉我我是否可能有任何东西 微笑

您可以找到代码 GitHub..

Updated: