【问题标题】:Using the WCF DataContractJsonSerializer in .NET 3.5在 .NET 3.5 中使用 WCF DataContractJsonSerializer
【发布时间】:2010-07-05 09:00:00
【问题描述】:

我正在尝试在我的 ASP.NET MVC 2 站点中使用此处的地理编码代码。不幸的是,其中一些代码,特别是 DataContractJsonSerializer 的使用,只能通过 .NET 4.0 实现。由于我的托管服务提供商不支持 .NET 4,我不得不在 .NET 3.5 中实现该功能。

如何修改代码(我已在下面重新发布)以在 .NET 3.5 中工作?

如果在 3.5 中更容易序列化,Google Maps Geocoding API 也可以返回 XML...


下面是我尝试从 .NET 4 转换为 .NET 3.5 的代码:

using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Net;
using System.Web;

.
.
.

private static GeoResponse CallGeoWS(string address)
{
        string url = string.Format(
                "http://maps.google.com/maps/api/geocode/json?address={0}&region=dk&sensor=false",
                HttpUtility.UrlEncode(address)
                );
        var request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
        request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GeoResponse));
        var res = (GeoResponse)serializer.ReadObject(request.GetResponse().GetResponseStream());
        return res;
}

[DataContract]
class GeoResponse
{
        [DataMember(Name="status")]
        public string Status { get; set; }
        [DataMember(Name="results")]
        public CResult[] Results { get; set; }

        [DataContract]
        public class CResult
        {
                [DataMember(Name="geometry")]
                public CGeometry Geometry { get; set; }

                [DataContract]
                public class CGeometry
                {
                        [DataMember(Name="location")]
                        public CLocation Location { get; set; }

                        [DataContract]
                        public class CLocation
                        {
                                [DataMember(Name="lat")]
                                public double Lat { get; set; }
                                [DataMember(Name = "lng")]
                                public double Lng { get; set; }
                        }
                }
        }
}

【问题讨论】:

    标签: c# .net wcf .net-3.5 datacontractserializer


    【解决方案1】:

    您遇到的具体问题是什么?

    如果没有更多详细信息,很难诊断出确切的问题,但DataContractJsonSerializer 在 .NET 3.5 中可用 - 您需要手动添加对 System.ServiceModel.Web 的引用.dll.

    (请注意,MSDN 文档误导性地指出,DataContractJsonSerializer 可以在 System.Runtime.Serialization.dll 中找到。虽然这适用于 .NET 4,但 .NET 3.5 版本的 @ 987654324@ 实际上存在于 System.ServiceModel.Web.dll。)

    【讨论】:

    • 奇怪...我确实添加了对该 DLL 版本 3.0 的引用,但它告诉我它仍然找不到类型 - 至于 using 语句,我有一个引用 System.运行时。序列化。什么给了?
    • @Maxim:试试using System.Runtime.Serialization.Json;
    • @Maxim:抱歉。 .NET 3.5 的 MSDN 文档错误地指出 DataContractJsonSerializer 位于 System.Runtime.Serialization.dll 中。这在 .NET 4 中是正确的,但在 3.5 中它可以在 System.ServiceModel.Web.dll 中找到。 (我会相应地更新我的答案。)
    • 它在 System.Runtime.Serialization.dll 和 System.ServiceModel.Web.dll 中都可用。 [链接] (forums.silverlight.net/post/47045.aspx)
    • 不使用 System.Runtime.Serialization.dll/System.ServiceModel.Web.dll 切换到 NewtonSoft.Json 库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多