2012-07-20 12 views
5

Sto cercando un serializzatore binario perché nella mia app, l'utente può scoprire molti elementi come vogliono. Immagina che l'utente abbia scoperto più di 100 articoli (questi elementi sono stati scaricati da internet) e quando l'app è sospesa, l'app non riesce a trovare l'ultimo elemento perché non esiste.Esiste un serializzatore binario in WIN RT?

Nell'app accade perché carico sempre i primi 10 elementi. Ma secondo i principi della metropolitana, l'app ha bisogno di ripristinare tutto ... quindi stavo pensando di usare il serializzatore binario per salvare rapidamente questi oggetti. Ma non riesco a trovare nessuna classe che possa aiutarmi.

EDIT:

public abstract class BaseItem 
{ 
    ... 

    public BaseGroup Group { get; set;} 
} 

public abstract class BaseGroup 
{ 
    public IEnumerable<BaseItem> Items { get; set; } 
} 

public sealed class FeedDataGroup 
{ 
    ... 
} 

public sealed class FeedItem 
{ 
    ... 
} 

ho intenzione di serializzare un ObservableCollection. Se uso JSON, ci sarà qualche problema nel modo in cui ho strutturato le mie classi?

+0

Puoi parlarmi di Json? Io davvero sconosciuto di quello .. –

+0

Ohh capisco, solo una domanda. Per favore guarda la mia modifica, mi piace usare BinarySerializer perché può serializzare tutto, ma come il modo in cui ho strutturato le mie classi, ho dei dubbi –

+0

Non sembra che ci sia alcun problema con il design della tua classe se usi JSON. Se hai problemi con il serializzatore Json integrato, dovresti usare Newtonsoft.Json. In ogni caso, potrebbe essere meglio aggiungere anche del caching degli elementi che hai scaricato direttamente nel tuo livello di servizio se i tuoi articoli non sono suscettibili di modifiche frequenti. In questo modo l'app funzionerebbe anche senza una connessione Internet. – Kolja

risposta

6

codice di esempio Microsoft utilizza DataContractSerializer

 // Serialize the session state synchronously to avoid asynchronous access to shared 
     // state 
     MemoryStream sessionData = new MemoryStream(); 
     DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, object>), _knownTypes); 
     serializer.WriteObject(sessionData, _sessionState); 

     // Get an output stream for the SessionState file and write the state asynchronously 
     StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(sessionStateFilename, CreationCollisionOption.ReplaceExisting); 
     using (Stream fileStream = await file.OpenStreamForWriteAsync()) 
     { 
      sessionData.Seek(0, SeekOrigin.Begin); 
      await sessionData.CopyToAsync(fileStream); 
      await fileStream.FlushAsync(); 
     } 
+0

Potrei sbagliarmi ma non ho trovato un caso in cui è meglio di 'XmlSerializer' –

2

C'è la classe BinaryFormatter in System.Runtime.Serialization che fa ciò che descrivi. Non ho esperienza specifica con WinRT, ma la classe è disponibile in .Net 4.5, quindi credo che potresti farne uso.

La critica di seguito è giusto: non solo ho omettere la parola "cuore" dopo .Net 4.5 sopra (cambiare il significato del mio messaggio piuttosto gravemente), avevo basato la mia commento sul fatto che gli altri membri del System.Runtime.Serialization lo ha trasformato in .Net 4.5 Core. Guardando a a list of differences between 4.5 and core, vedo che il BinaryFormatter è escluso in modo specifico.

+3

Solo perché esiste in .NET 4.5 non significa che puoi usarlo con il profilo WinRT .NET. Devo sottopormi a questa risposta perché, ad essere onesti, non sembri certo che possa anche essere usato. –

+0

@Ramhound, hai ragione - la risposta non ha senso così com'è. –

0

C'è un serializzatore JSON nel using namespace System.Runtime.Serialization.Json che serializza a JSON se questo è ciò che si voleva. Per utilizzare i serializzatori si dovrebbe contrassegnare tutti i dati che verranno serializzati come DataContract

[DataContract] 
public class Serializable 
{ 
    [DataMember] 
    Public string SerializableMember{get;set;} 

    Public string NonSerializedMember{get;set;} 
} 

È ora possibile utilizzare il DataContractJsonSerializer per serializzare l'oggetto in un flusso JSON. la struttura JSON creata sarà simile al seguente: {"SerializableMember": {valore dei dati}} non ci sono informazioni sulla classe memorizzate, ma sia i nomi dei membri che i valori saranno corretti dai membri serializzabili della classe all'oggetto json . JSON è un po 'più compatto di xml, quindi è meglio per grandi serie di dati. Sospetto che Microsoft abbia omesso il serializzatore Binario di Metro poiché i processori ARM possono essere sia grandi che piccoli Endian e il programmatore non ha il controllo su questa materia.

0

Un'opzione è SharpSerializer per la serializzazione binaria. Il suo utilizzo è estremamente semplice.

Problemi correlati