2015-01-14 12 views
5

'Üzerinde bir kurucu bulunamıyor' Kodumda bu çok garip bir sorun var ve yarım yıl önce elimde olmadığından oldukça yeni bir sorun var. Uzun lafın kısası, Xamarin'de bir uygulama yaptım ve yaklaşık yarım yıl önce, tüm 3 mağazada (App Store, Google Play ve Microsoft Store) yayınladım.JsonSerializationException Xamarin.Android

Dün kullanıcı Android uygulamasıyla bir sorun rapor ve ben sabit ve yeniden derlenmesi olduğunu aldıktan sonra, şimdi Json.NET

ile yeni bir hatasıyla karşılaşıyorsanız ediyorum

istisna

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. 

olduğunu Ve sen sormadan önce, evet Rowlog.Common.Dtos.CompressedTripData gerçekten bir parametresiz kurucu var (Peki, hepimiz aynı şey olduğunu bildiğimiz bir tane yok).

Ve dediğim gibi, bir Android cihazında sunucudan bir SıkıştırılmışTransferi nesnesi yüklediğimde budur. IOS ve Windows Phone'da aynı nesnenin yüklenmesi bir aksama olmadan çalışır. Sanırım Json.NET ya da Xamarin.Android'te buna neden olan son bir değişiklik olmalı. (Diğer uygulamalar hala yaklaşık yarım yıl önce Json.NET kütüphanelerini kullanıyor. o zamandan beri herhangi bir güncelleme yapıldı)

Başka biriyle benzer bir sorunla karşılaştı mı, eğer öyleyse, bunu nasıl düzelttiniz?

cevap

13

Proje özelliklerinin 'Android options' sekmesinde bir 'linker' sekmesi vardır. Seçili seçenek 'Bağlantı' açılırken "Sadece Sdk Montajları" nda mı yoksa "SDK ve kullanıcı montajları" mı?

İkincisiyse, bağlanırken parametrelenmemiş kurucu atlanır, çünkü hiçbir kullanım algılanmaz. Bu yüzden "Sdk Assemblies sadece" olarak değiştirin.

+0

Evet, bu sorun oldu. Çok teşekkür ederim efendim, gerçekten bir hayat kurtarıcısınız! – Falgantil

+0

Bunun için çok teşekkür ederim - Sürüm hatalarında bu hatayı alıyordum, ancak Hata Ayıklama yapılamıyor. Bu linker seçeneklerinin etkileri belirgin olmadığından bana çok fazla zaman ayırdı (ve JSON.NET'e serigrafi ile çok daha fazla el vermek üzereydim). Başlangıçta bu ayarın Android uygulama paketine bağlı ayrı bir kütüphane paketine bağlı DLL'leri belirlemek olduğu izlenimi uyandırıyordu ... –

1

Koru özniteliği, genel olarak kodunuzda bir şey yapmasını tercih ederseniz, bir üye linker tarafından kaldırılmadığından emin olmak için daha odaklanmış bir yoldur.

Örnek:

[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

Bunu denediğimde bir istisna alıyorum: "LinkAssemblies" görevi başarısız oldu. .. başarısız oldu Mono.Security.MonoTlsProviderFActoryDelegate' – Akbari

+0

SO @Akbari hakkında yeni bir soru sorulmasını önerin. Bu günlerde gerçekten çok fazla Android yapmıyorum. – t9mike