c# - Geoposition deserialization error (Newtonsoft.Json) -2146233088 -


i'm trying deserialize geoposition object in windows phone (winrt) app getting exception:

-2146233088 message: "unable find constructor use type windows.devices.geolocation.geoposition. class should either have default constructor, 1 constructor arguments or constructor marked jsonconstructor attribute. path 'civicaddress'".

is geoposition not compatible newtonsoft json.net? if not, use in finding workaround.

the code snippet below shows exception thrown.

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); } 

it seems geoposition has read-only properties, , no public constructor takes values these properties constructor arguments. can serialize it, not construct during deserialization.

what work-around, construct own version of class serialization purposes, including properties need in app.

for example, if in question, need geoposition.coordinate.point field serialized, following:

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);         }     } } 

when serializing can do:

geoposition position = ....; // call position. currentcontext.locationasstring = jsonconvert     .serializeobject(new serializablegeopoint(position)); 

and deserializing as:

var locationpoint = jsonconvert     .deserializeobject<serializablegeopoint>(currentcontext.locationasstring)     .towindowsgeopoint(); 

you may need add serialization settings somewhere during application startup, perform other one-time initializations app.

jsonconvert.defaultsettings = (() => {     var settings = new jsonserializersettings();     settings.converters.add(new stringenumconverter());     return settings; }); 

it specifies default settings json serialization, in case adding converter knows how convert between enums , strings.


Popular posts from this blog