2009-08-17 8 views
1

Puis-je désérialiser un objet dans l'environnement d'exécution Silverlight 3.0 qui a été sérialisé à l'aide de l'environnement d'exécution .NET 2.0 complet à l'aide de BinaryFormatter? J'utilise le code suivant pour sérialiser un objet à un ByteArray que nous écrivons à une table de DB:Prise en charge de la sérialisation binaire Silverlight 3.0?

 MemoryStream serStream = new MemoryStream(); 
     BinaryFormatter binFormatter = new BinaryFormatter(); 
     binFormatter.Serialize(serStream, csMetric); 


     serStream.Position = 0; 
     return serStream.ToArray(); 

Le client Silverlight doit alors de récupérer ces données binaires de la DB (via un appel de service Web) et deserizlize les octets de retour dans une instance de la classe csMetric.

Est-ce possible? Si oui, comment cela se fait-il sur le client étant donné que le BinaryFormatter n'est pas disponible dans le runtime SL 3.0?

Merci, jon

Répondre

0

Puisque vous devez passer par WCF, et donc le .NET Framework complet, pour obtenir les données dans Silverlight de toute façon je vous recommande désérialisation l'objet sur le serveur avant de le renvoyer à Silverlight. La pile WCF Silverlight 3 prend en charge le codage WCF binaire, ce qui devrait rendre le transfert de données raisonnablement efficace.

+0

Merci James ... c'est ce que nous faisons en ce moment, mais cela implique un saut de sérialisation/désérialisation supplémentaire sur le service WCF. Nous aimerions éviter cela en demandant au service WCF de simplement renvoyer les octets hors de la base de données et de les envoyer directement au client SL ... sans vraiment savoir si cela est possible avec l'exécution de SL. –

0

Jon,

Avez-vous essayé de désérialiser l'objet en utilisant DataContractSerializer? Je ne l'ai pas testé ce scénario exact, mais comment je l'aborde:

ce qui suit est une méthode d'extension hors d'un tableau d'octets (byte []):

pubilc static T Deserialize<T>(this byte[] yourSerializedByteArray) 
{ 
T deserializedObject; 

DataContractSerializer serializer = new DataContractSerializer(typeof(T)); 
using(MemoryStream ms = new MemoryStream(yourSerializedByteArray)) 
{ 
    deserializedObject = (T)serializer.ReadObject(ms); 
} 

return deserializedObject; 
} 
+0

bonne idée, je me demande si cela fonctionne – Neil

0

DataContractSerializer a tout un tas de problèmes, j'ai créé un sérialiseur binaire qui supprime certains d'entre eux (au moins pour moi!) Il utilise la réflexion et produit des représentations raisonnablement compactes qui peuvent être envoyées aux services WCF.

Plus d'infos here.

0

Peut-être que vous souhaitez essayer mon SharpSerializer. Il peut sérialiser les données au format binaire et xml. Il fonctionne sur .NET Full, Compact et Silverlight.

+0

semble agréable. Pour le pire, vous venez seulement ici pour le promouvoir. ( – kenny