2015-01-14 18 views
5

Ho questo problema molto strano con il mio codice, ed è un problema piuttosto nuovo, considerando che non l'ho avuto sei mesi fa. Per farla breve, ho creato un'app in Xamarin e l'ho pubblicata circa sei mesi fa su tutti e 3 i negozi (App Store, Google Play e Microsoft Store).JsonSerializationException 'Impossibile trovare un costruttore' su Xamarin.Android

Ieri un utente ha segnalato un problema con l'applicazione Android, e dopo che ho ottenuto che fissa e ricompilato, ora sto incontrando un nuovo errore con Json.NET

L'eccezione è

Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type Rowlog.Common.Dtos.CompressedTripData. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'tripCoordinates', line 1, position 19. 

E prima che tu me lo chieda, sì Rowlog.Common.Dtos.CompressedTripData ha effettivamente un costruttore senza parametri (beh, non ne ha affatto uno, che sappiamo tutti è la stessa cosa).

E come ho detto, questo è quando carico un oggetto CompressedTripData dal server su un dispositivo Android. Caricare lo stesso identico oggetto su iOS e Windows Phone funziona senza intoppi. Suppongo che debba esserci una modifica recente in Json.NET o Xamarin.Android che sta causando questo problema (le altre app utilizzano ancora le librerie Json.NET da circa sei mesi fa. Non sono sicuro che ci sia anche sono stati aggiornamenti da allora)

Qualcun altro ha riscontrato un problema simile e, in caso affermativo, come l'hai risolto?

risposta

13

Nella scheda "Opzioni Android" delle proprietà del progetto, è presente una scheda "linker". L'opzione selezionata nel menu a discesa "Collegamento" è disponibile solo per "Sdk Assemblies" o "Sdk e assembly utente"?

Se è il secondo, il costruttore senza parametri viene saltato durante il collegamento, poiché non viene rilevato alcun utilizzo. Quindi modificalo in "Solo assembly Sdk".

+0

Sì, questo era il problema. Grazie, signore, sei davvero un risparmiatore di vita! – Falgantil

+0

Grazie mille per questo - stavo ricevendo questo errore su build di rilascio ma non su build di debug. Mi ha risparmiato un sacco di tempo, poiché gli effetti di queste opzioni di linker non sono evidenti (e stavo per dare a JSON.NET un maggiore appiglio con la deserializzazione). Inizialmente avevo l'impressione che questa impostazione fosse per determinare le DLL collegate al pacchetto di app Android rispetto a un pacchetto di libreria separato ... –

1

L'attributo Preserve è un modo più mirato per garantire che un membro non venga rimosso dal linker se si preferisce continuare a farlo con il codice.

Esempio:

[Preserve] 
[JsonConstructor] 
private AlertRequest(bool fake_arg) 
{ 
    // fake_arg is to have a unique ctor that we exclusively 
    // use in JSON de-serialization via JsonConstructor attribute. 
    // Preserve attribute ensures Xamarin linker does not remove, 
    // as there are no direct uses of this ctor in the code base 
} 
+0

Quando provo, otterrò un'eccezione: "L'attività" LinkAssemblies "non è riuscita. .. fallito o risolto Mono.Security.MonoTlsProviderFActoryDelegate' – Akbari

+0

Consiglia di fare una nuova domanda su SO @Akbari. Di questi tempi non faccio molto w/Android. – t9mike

Problemi correlati