5

我正在寻找二进制序列化程序,因为在我的应用程序中,用户可以根据需要发现许多项目。假设用户发现了 100 多个项目(这些项目是从 Internet 下载的),当应用程序暂停时,应用程序无法找到最后一个项目,因为不存在。

在应用程序中发生这种情况是因为我总是加载前 10 个项目。但在 Metro 原则中,应用程序需要恢复所有内容。所以我在考虑使用二进制序列化程序快速保存这些对象。但是我找不到任何可以帮助我的课程。

编辑:

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,我构建课程的方式会有什么问题吗?

4

4 回答 4

6

Microsoft 示例代码使用 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();
        }
于 2012-07-20T21:32:45.373 回答
2

System.Runtime.Serialization 中有BinaryFormatter类,可以按照您的描述进行操作。我没有专门使用 WinRT 的经验,但该课程在 .Net 4.5 中可用,因此相信您可以使用它。

下面的批评是公平的:我不仅在上面的 .Net 4.5 之后省略了“核心”这个词(相当严重地改变了我的信息的含义),而且我的评论基于 System.Runtime.Serialization 的其他成员的事实进入 .Net 4.5 Core。查看4.5 和 core 之间的差异列表,我发现 BinaryFormatter 特别被排除在外。

于 2012-07-20T18:57:10.437 回答
0

using System.Runtime.Serialization.Json 命名空间中有一个 Json 序列化程序,如果这是您想要的,它会序列化为 JSON。要使用序列化器,您应该将任何将被序列化的数据标记为数据合同

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

   Public string NonSerializedMember{get;set;}
}

您现在可以使用 DataContractJsonSerializer 将 Object 序列化为 JSON 流。创建的 JSON 结构将如下所示: {"SerializableMember" : {value of data} } 没有存储类信息,但成员名称和值都将从类的可序列化成员存储到 json 对象。JSON 比 xml 更紧凑,因此更适合大型数据集。我怀疑微软确实从 Metro 中省略了二进制序列化程序,因为 ARM 处理器既可以是 Big Endian 也可以是 Little Endian,并且程序员无法控制这件事。

于 2013-01-10T19:51:59.113 回答
0

一个选项是用于二进制序列化的SharpSerializer 。它的用法非常简单。

于 2014-08-22T12:51:16.670 回答