2012-09-11 20 views
5

Jak mogę używać BinaryFormatter w Windows Phone 7.Jak korzystać BinaryFormatter w Windows Phone 7

Używam tego using System.Runtime.Serialization.Formatters.Binary w service1.svc.cs ale nie mogę używać tego odniesienia w Windows Phone 7.

Czy istnieje rozwiązanie tego problemu?

mój kod Dla DeserializeObject

public static T DeserializeObject<T>(byte[] xml) 
    { 
     BinaryFormatter xs = new BinaryFormatter(); 
     MemoryStream memoryStream = new MemoryStream(xml); 
     return (T)xs.Deserialize(memoryStream); 
    } 

BinaryFormatter daje błąd w Windows Phone 7. W jaki sposób można I deserializowania. Jakie zmiany muszę wprowadzić w tym kodzie?

+0

Nie ma rozwiązania z usługą w formie pisemnej. Będziesz musiał zmienić usługę, aby korzystać z formatu serializacji obsługiwanego przez Windows Phone 7. Jeśli twoja usługa to WCF, dlaczego nie używasz DataContractSerializer i pozwalasz WCF obsługiwać serializację/deserializację? –

Odpowiedz

2

BinaryFormatter nie jest obsługiwane w systemie Windows Phone 7.

+0

dziękuję za odpowiedź Jak mogę użyć? –

+0

Nie możesz. Musisz przejść do silnika serializacji obsługiwanego na obu platformach. Być może protobuf-net, zobacz akceptowaną odpowiedź tutaj, aby uzyskać więcej informacji: http://stackoverflow.com/questions/5091712/binaryformatter-does-not-exist-in-cf-solutions – driis

+0

Czy możesz zobaczyć mój kod. –

6

Jak @driis wspomniano, nie można używać BinaryFormatter na Windows Phone. Można użyć kodu binarnego kodującego w punkcie końcowym WCF (tj. Punkcie końcowym, którego wiązanie jest niestandardowym wiązaniem z BinaryMessageEncodingBindingElement i HttpTransportBindingElement), i które będzie obsługiwane w WP7. Po prostu nie możesz tam użyć formatera binarnego.

Aktualizacja następujący komentarz: Patrząc na kod, to nie tylko, że kod, który trzeba zmienić - trzeba zmienić kod usługi z jak również, do serializacji obiektu w formacie, który jest obsługiwany Silverlight. Możesz użyć DataContractSerializer, z binarnym czytnikiem/pisarzem, lub możesz użyć innej biblioteki, która jest obsługiwana w obu przypadkach. Na przykład, poniższy kod powinien pracować w obu wersjach stacjonarnych i SL:

public static T DeserializeObject<T>(byte[] xml) 
{ 
    using (MemoryStream memoryStream = new MemoryStream(xml)) 
    { 
     using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(
      memoryStream, XmlDictionaryReaderQuotas.Max)) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(T)); 
      return (T)dcs.ReadObject(reader); 
     } 
    } 
} 

A na serwerze:

public static byte[] SerializeObject<T>(T obj) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(ms)) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(T)); 
      dcs.WriteObject(writer, obj); 
      writer.Flush(); 
      return ms.ToArray(); 
     } 
    } 
} 
+0

Czy możesz zobaczyć mój kod –

+0

Ten kod powoduje błąd podobny do tego. Message = "Typ" System.Net.PathList "z nazwą kontraktu danych" PathList: http: //schemas.datacontract.org/2004/07/System.Net ' nie jest oczekiwany.Rozważ użycie DataContractResolver lub dodaj jakiekolwiek typy nieznane statycznie do listy znanych typów –

+0

Jaki typ obiektu próbujesz przekształcić do postaci szeregowej? – carlosfigueira

0

Nie ma wsparcia dla biblioteki serializacji binarnej na WP 7.1. jak wspomina driis.

Zamiast tego należy raczej użyć XmlObjectSerializer lub nawet jednej z jej podklas, które obsługują serializację najczęstszych obiektów API, takich jak dane kontaktów lub podobne.

Po sprawdzeniu złożenia przestrzeni nazw (np. W przeglądarce obiektów Visual Studio) znalazłeś hierarchię odpowiednich klas.

A dlaczego obchodzi Cię metoda serializacji? Serializacja XML jest bardziej przenośna, bardziej jednolita i łatwiejsza do odczytania przez człowieka.

+0

Jestem nowy, więc nie wiem, jak tego użyć. Zamieść mój kod w moim pytaniu. –

+0

carlosfigueira napisała bardzo rozsądną odpowiedź, by rozwiać twoje wątpliwości. Użyj jego rozwiązania, ponieważ wygląda dobrze (http://stackoverflow.com/a/12376808/1598508). –

+0

to nie działa, daje błąd –

Powiązane problemy