2012-07-20 14 views
5

Estoy buscando un serializador binario porque en mi aplicación, el usuario puede descubrir muchos elementos como lo desee. Imagine que el usuario ha descubierto más de 100 elementos (estos elementos se han descargado de Internet) y, cuando la aplicación se suspende, la aplicación no puede encontrar el último elemento porque no existe.¿Existe un serializador binario en WIN RT?

En la aplicación sucede esto porque siempre cargo los primeros 10 elementos. Pero en los principios del metro, dijo, la aplicación necesita restaurar todo ... así que estaba pensando en utilizar el serializador binario para guardar estos objetos rápidamente. Pero no puedo encontrar ninguna clase que pueda ayudarme.

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 
{ 
    ... 
} 

planeo para serializar un ObservableCollection. Si uso JSON, ¿habrá algún problema por la forma en que he estructurado mis clases?

+0

¿Puede hablarme de Json? Realmente desconocido sobre eso ... –

+0

Ohh, ya veo, solo una pregunta. Por favor mira mi edición, me gusta usar BinarySerializer porque puedo serializar todo, pero como la forma en que he estructurado mis clases, tengo dudas –

+0

Parece que no hay ningún problema con el diseño de tu clase si usas JSON. Si tiene problemas con el serializador Json incorporado, entonces debe usar Newtonsoft.Json. De todos modos, es mejor agregar también algo de almacenamiento en caché de los elementos que ha descargado directamente en su capa de servicio si es poco probable que sus elementos cambien con frecuencia. De esa forma, tu aplicación también funcionaría sin conexión a Internet. – Kolja

Respuesta

6

código de ejemplo Microsoft utiliza 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

Podría estar equivocado, pero no he encontrado un caso en el que sea mejor que 'XmlSerializer' –

2

Existe la clase BinaryFormatter en System.Runtime.Serialization que hace lo que usted describe. No tengo experiencia específicamente con WinRT, pero la clase está disponible en .Net 4.5, así que creo que podría usarla.

La crítica a continuación es justa: no solo omití la palabra "core" después de .Net 4.5 (cambiando el significado de mi mensaje con bastante severidad), basé mi comentario en el hecho de que otros miembros de System.Runtime.Serialization lo hizo en .Net 4.5 Core. Mirando a list of differences between 4.5 and core, veo que BinaryFormatter específicamente está excluido.

+3

El hecho de que exista en .NET 4.5 no significa que pueda usarlo con WinRT .NET Profile. Tengo que rechazar esta respuesta porque, para ser honesto, no parece estar seguro de que pueda usarse. –

+0

@Ramhound, tienes razón, la respuesta no tiene sentido tal como estaba. –

0

Hay un serializador JSON en el espacio de nombres utilizando System.Runtime.Serialization.Json que serializa a JSON si esto es lo que quería. Para utilizar los serializadores que debe marcar los datos que serán serializados como DataContract

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

    Public string NonSerializedMember{get;set;} 
} 

Ahora puede utilizar el DataContractJsonSerializer para serializar el objeto a una corriente JSON. la estructura JSON creada tendrá el siguiente aspecto: {"SerializableMember": {value of data}} no hay información de clase almacenada, pero los nombres de miembros y los valores se almacenarán desde miembros serializables de la clase hasta el objeto json . JSON es un poco más compacto que xml, por lo que es mejor para grandes conjuntos de datos. Sospecho que Microsoft omitió el serializador binario de Metro ya que los procesadores ARM pueden ser grandes y pequeños Endian y el programador no tiene control sobre este asunto.

0

Una opción es SharpSerializer para la serialización binaria. Su uso es extremadamente simple.

Cuestiones relacionadas