2012-05-08 2 views
2

J'essaie actuellement de résoudre un problème wierd. celui que je ne peux pas trouver beaucoup d'informations sur.C# Sérialisation/désérialisation entre compact .net et .net standard

en bref:

Lorsque désérialiser un objet serialzed xml je reçois une instance du type d'objet correct, mais j'obtenir que des valeurs par défaut à l'intérieur de l'objet.

plus longue histoire:

sérialisation et désérialisation sur deux plates-formes se produit différentes. L'un est le framework .net compact (pour un téléphone mobile Windows), l'autre est le framework .net standard.

La sérialisation puis la désérialisation sur la même plate-forme produisent un objet correctement rempli, le problème se produit uniquement lorsqu'une chaîne sérialisée est envoyée à l'autre plate-forme.

J'ai également obtenu des fichiers de test xml d'un autre service qui provisionnera mon service avec des données, ces fichiers xml se désérialisent correctement.

spécificités:

Le XML généré diffèrent légèrement selon les plateformes. (Notez, ce sont des fragments de la structure XML interne où j'ai identifié des différences reproduisants Lire:. L'unité est pas un nœud racine)

client (téléphone, Compact Framework)

<Unit> 
    <UnitId xmlns="">555</UnitId> 
    <VehicleId xmlns="">555</VehicleId> 
    <EmployeeId xmlns="">004</EmployeeId> 
</Unit> 

Server (.net régulier serveur)

<Unit xmlns=""> 
    <UnitId>555</UnitId> 
    <VehicleId>555</VehicleId> 
    <EmployeeId>004</EmployeeId> 
</Unit> 

à partir du système parent (plateforme inconnue)

<Unit> 
    <UnitId>308</UnitId> 
    <VehicleId>307</VehicleId> 
    <EmployeeId>ASA 500</EmployeeId> 
</Unit> 

En outre, au lieu de définir l'espace de noms standard (xmlns) le système parent utilise un préfixe dans le nœud racine, comme ceci:

<amg:RequestFinishRoute xmlns:amg="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute"> 

alors que les données que nous créons par sérialisation donne:

<RequestFinishRoute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute"> 

I utiliser un:

System.Xml.Serialization.XmlSerializer 

Sérialiser pour effectuer la sérialisation/désérialisation (uniquement sérialiseur pris en charge dans un environnement compact).

Le code pour ce faire est généré par xsd2code.

question:

Quelqu'un a des conseils ou des ressources sur ce problème?

+0

Quel sérialiseur? Je devine BinaryFormatter? –

+0

s'il s'agit de XML, pourquoi ne pas essayer la sérialisation sur les deux plates-formes et voir la différence? Dans mon expérience, il devrait donner le même résultat, mais encore une fois, tout peut être dans Compact Framework. La vraie solution est de ne pas utiliser Compact Framework :) – zmilojko

+0

Si vous pouvez nous montrer un test XML entre les deux plates-formes, il y a probablement quelques différences. –

Répondre

1

J'ai trouvé une solution, et l'affichage im ici pour d'autres avec le même problème.

Après quelques essais avec les classes générées j'ai trouvé que le cadre compact n'aime pas les objets dérivés.

Le schéma défini une base de l'objet « route », et un couple d'objets « de route » spécialisés. Ceci traduit en code xsd2 générant une classe de base "baseRoute" et des routes spécialisées comme "someRoute: baseRoute".

Retrait de l'héritage et du copier-coller le code de « baseRoute » dans les itinéraires spécialisés résoudre tous mes problèmes.

i également suivi de Vincel (points pour vous) des conseils pour passer à un XmlTextWriter. Ce faisant, l'encodage des caractères est fait automatiquement, c'est plus pratique.

1

Les deux plates-formes utilisent-elles le même codage? Mes Xml générés à partir d'un scanner de codes à barres portatif étaient capables de lire par programme VFP sur PC. Quoi qu'il en soit, je préfère utiliser XmlTextWriter au lieu de XmlSerializer.

+0

Nous utilisons exactement les mêmes classes pour l'encodage/décodage sur les deux systèmes. Malheureusement, nous ne pouvons pas sauter cadre compact depuis cette application fonctionne sur un téléphone Windows robuste. – Victor

1

J'ai couru dans cette fois.

Pour moi, le problème a été d'ajouter la classe à chaque projet:

espace de noms

ProjectPC

classe SerializableClass1

Et

espace de noms

ProjectMobile

classe SerializableClass1

J'étais désérialisation sans succès ProjectPC-ProjectMobile même si la classe SerializableClass1 était identique dans les deux espaces de noms.

La solution pour moi était de créer un espace de noms unique et l'importer dans chaque projet séparément:

espace de noms

ProjectUniversal

classe SerializableClass1

Cela fait, vous devrez incluez ce ProjectUniversal dans chacun de vos autres projets.

Pour plus de flexibilité, j'ai également fait ProjectUniversal avec ses propres Sérialise statiques et les méthodes deserialize.

J'espère que cela est logique.

+0

Je le fais aussi, tous mes objets générés résident dans un module partagé – Victor

Questions connexes