8
votes

Comment puis-je désérialiser avec tynameHandling.Objects dans json.net Silverlight?

Je reçois une exception lorsque vous essayez de désérialiser à Silverlight. Test1 échoue, tandis que Test2 réussit. J'ai également essayé tynameAseSeullyFormat à la fois simple et complet, mais obtenez les mêmes résultats. Test2 peut résoudre l'assemblage, pourquoi ne peut pas JSON.NET?

oublié de mentionner le type que j'essaie de désérialiser est défini dans un assemblage différent de l'assemblage Silverlight où la désérialisation On se produit.

Les deux tests fonctionnent dans une application non silencerlight .NET.

Comment puis-je désérialiser une chaîne JSON qui a des noms de caractères? xxx

Ce test2 réussit: xxx


2 commentaires

Pourquoi n'ajoutez-vous pas votre solution comme réponse et acceptez-la de manière à ne pas apparaître dans la liste sans réponse?


@keyr fait, mais espérait une solution moins hacky.


3 Réponses :


2
votes

J'ai résolu mon problème en téléchargeant la source de JSON.NET 4.0R2 et ajoutez 2 lignes de code de piratage à défaiteRiorialisationBinder.cs, comme indiqué ci-dessous. Cela ne fonctionnera probablement pas pour de fortes assemblées nommées. Silverlight manque une méthode pour analyser l'appdomain pour des assemblages chargés, voir ici . < Pré> xxx


0 commentaires

8
votes

Essayez d'ajouter des paramètres à JSONCONVERT.DESERIALIZEOBJECT (JSON, SETTINGES) CODE>, où les paramètres sont les suivants:

new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
                }


3 commentaires

Merci! Vous avez grandement simplifié ma vie.


J'ai essayé cela et ça n'a pas fonctionné. Je reçois toujours l'exception System.IO.FileloadException: impossible de charger le fichier ou l'assemblage ... ou l'une de ses dépendances. La version de l'Assemblée demandée est conflit avec ce qui est déjà lié dans le domaine de l'application ou spécifié dans le manifeste ... Je constate que le problème est que si les informations complètes du montage ne sont pas incluses, elle ne fonctionne pas. Je suis également confondu pourquoi cela est accepté parce que l'OP a spécifiquement publié que le tynameAssemblyFormat = FormatterassemblayStyle.full n'a pas fonctionné.


Oh mon Dieu. Merci beaucoup! J'ai eu la première partie, mais je ne savais pas sur le typenameAssemblyFormat.



1
votes

Je pose ma solution ici qui ne nécessite pas de modification de JSON.NET:

Le problème est que la ligne suivante n'est pas suffisante pour Silverlight: P>

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var n1 = JsonConvert.DeserializeObject<NTPoint>(json, settings);


1 commentaires

Cette solution a fonctionné pour moi, bien que je ne sois pas à l'aise avec le piratage manuel du JSON avant la désérialisation. Je pense qu'une autre approche pourrait être d'avoir un modèle de modèle commun avec le même nom et d'avoir une version / une version de Silverlight.