在.NET 3.5中使用WCF DataContractJsonSerializer

Max*_*sky 2 .net c# wcf datacontractserializer .net-3.5

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

我如何重新编写代码(我在下面重新发布)在.NET 3.5中工作?

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


下面是我试图从.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; }
                        }
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*keH 16

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

如果没有更多的细节很难诊断确切的问题,但是DataContractJsonSerializer 在.NET 3.5可用-你需要一个参考手动添加到System.ServiceModel.Web.dll.

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

  • @Maxim:道歉..NET 3.5的MSDN文档错误地指出`DataContractJsonSerializer'存在于*System.Runtime.Serialization.dll*中.这在.NET 4中是正确的,但在3.5中可以在*System.ServiceModel.Web.dll*中找到.(我会相应地更新我的答案.) (2认同)