我尝试在我的Windows Phone(WinRT)应用中反序列化Geoposition
对象,但获取此Exception
:
带消息的-2146233088:"无法找到用于类型
Windows.Devices.Geolocation.Geoposition
的构造函数。一堂课要么 有一个默认的构造函数,一个带参数的构造函数或一个 用JsonConstructor属性标记的构造函数。路径 ' CivicAddress'"
Geoposition
与Newtonsoft Json.NET不兼容吗?如果不是,我可以帮助找到解决方法。
下面的代码片段显示了抛出异常的位置。
public async void Sample()
{
Geolocator geo = new Geolocator();
geo.DesiredAccuracyInMeters = 50;
var x = await geo.GetGeopositionAsync();
Geoposition geo = JsonConvert.DeserializeObject<Geoposition>(CurrentContext.LocationAsString);
await EventMap.TrySetViewAsync(geo.Coordinate.Point, 18D);
}
答案 0 :(得分:2)
似乎Geoposition
只有只读属性,没有公共构造函数将这些属性的值作为构造函数参数。因此,您可以序列化它,但不能在反序列化期间构造它。
您可以做的解决方法是构建您自己的此类版本,专门用于序列化目的,包括您在应用中实际需要的属性。
例如,如果您的问题中只需要序列化Geoposition.Coordinate.Point
字段,则可以执行以下操作:
namespace YourAppNameSpaceHere
{
using Windows.Devices.Geolocation;
public class SerializableGeoPoint
{
public SerializableGeoPoint(Geoposition location)
: this(location.Coordinate.Point) {}
public SerializableGeoPoint(Geopoint point)
{
this.AltitudeReferenceSystem = point.AltitudeReferenceSystem;
this.GeoshapeType = point.GeoshapeType;
this.Position = point.Position;
this.SpatialReferenceId = point.SpatialReferenceId;
}
[JsonConverter(typeof(StringEnumConverter))]
public AltitudeReferenceSystem AltitudeReferenceSystem { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public GeoshapeType GeoshapeType { get; set; }
[JsonProperty]
public BasicGeoposition Position { get; set; }
[JsonProperty]
public uint SpatialReferenceId { get; set; }
public Geopoint ToWindowsGeopoint()
{
return new Geopoint(Position, AltitudeReferenceSystem, SpatialReferenceId);
}
}
}
序列化时,您可以这样做:
Geoposition position = ....; // call to get position.
CurrentContext.LocationAsString = JsonConvert
.SerializeObject(new SerializableGeoPoint(position));
反序列化为:
var locationPoint = JsonConvert
.DeserializeObject<SerializableGeoPoint>(CurrentContext.LocationAsString)
.ToWindowsGeopoint();
您可能需要在应用程序启动期间的某处为序列化设置添加此项,您可以在其中为应用程序执行其他一次性初始化。
JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
return settings;
});
它指定了JSON序列化的默认设置,在这种情况下添加知道如何在枚举和字符串之间进行转换的转换器。