2012-07-20 53 views
5

我正在尋找一個二進制序列化程序,因爲在我的應用程序中,用戶可以根據需要發現多個項目。想象一下,用戶發現超過100個項目(這些項目是從互聯網下載的),當應用程序被暫停時,應用程序無法找到最後一個項目,因爲它不存在。WIN RT中是否存在二進制串行器?

在應用程序發生這種情況,因爲我總是加載前10項。但在地鐵原則說,應用程序需要恢復一切..所以我想使用二進制序列化器來快速保存這些對象。但我找不到任何能幫助我的課程。

編輯:

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

我打算序列化的ObservableCollection。如果我使用JSON,那麼按照我構建類的方式是否會有任何問題?

+0

你能告訴我關於Json嗎?我真的不知道那個.. – 2012-07-20 20:03:19

+0

哦,我明白了,只有一個問題。請觀看我的編輯,我喜歡使用BinarySerializer,因爲可以序列化所有內容,但作爲我構建類的方式,我懷疑 – 2012-07-20 20:19:22

+0

如果您使用JSON,它看起來不像您的類設計有任何問題。如果您在建立Json序列化程序時遇到問題,那麼您應該使用Newtonsoft.Json。無論如何,如果你的項目不經常改變,也可以將你已下載的項目緩存到服務層。這樣你的應用程序也可以在沒有網絡連接的情況下工作 – Kolja 2012-07-31 08:31:18

回答

6

微軟的代碼示例使用的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

我可能是錯的,但我還沒有找到比'XmlSerializer'更好的情況 – 2012-07-20 22:11:39

2

System.Runtime.Serialization中的 BinaryFormatter類可以完成您所描述的任務。我沒有專門用WinRT的經驗,但是該類可以在.Net 4.5中使用,所以相信你可以使用它。

以下的批評是公平的:我不僅在上面.Net 4.5之後省略了「核心」這個詞(改變我的消息的含義非常嚴重),而是基於我對其他成員System.Runtime.Serialization使它成爲.Net 4.5 核心。看看a list of differences between 4.5 and core,我發現BinaryFormatter具體排除在外。

+3

僅僅因爲它存在於.NET 4.5中,並不意味着您可以將它與WinRT .NET Profile一起使用。我必須低調回答這個問題,因爲說實話,你似乎並不確定它甚至可以被使用。 – 2012-07-20 19:26:19

+0

@Ramhound,你是對的 - 答案沒有道理,因爲它站起來。 – 2012-07-20 20:21:37

0

有一個在使用System.Runtime.Serialization.Json命名空間序列化到JSON,如果這是你想要的一個JSON序列。 要使用串行你應該標記將被序列化爲datacontract

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

    Public string NonSerializedMember{get;set;} 
} 

您現在可以使用DataContractJsonSerializer的對象序列化到一個JSON數據流的任何數據。 創建的JSON結構將如下所示:{「SerializableMember」:{數據的值}} 沒有存儲類信息,但成員名稱和值將從類的可序列化成員存儲到json對象。 JSON比xml更緊湊,所以對於大量數據更好。 我懷疑Microsoft確實忽略了來自Metro的二進制序列化程序,因爲ARM處理器可能既大又小,並且程序員無法控制此事。

0

用於二進制序列化的選項是SharpSerializer。它的使用非常簡單。

相關問題