【问题标题】:Serializing only some properties?只序列化一些属性?
【发布时间】:2012-03-08 23:13:01
【问题描述】:

我在 Windows Phone 7 中工作,但我想问题可能是 Silverlight(虽然不是 .NET,因为 ISerializable 在 Windows Phone 中不存在 suggested in this answer)。

我有许多在运行时创建的对象。除了少数属性外,它们几乎总是相同的。

所以我会有一个对象:

Public Class Article
    Public Property Title As String
    Public Property Author As String
    Public Property HasBeenViewed As Boolean
    Public Property DateViewed As Date
    Public Property IsPriorityArticle As Boolean
End Class

我希望能够这样写:

<DataContract()>
Public Class Article
    <IgnoreDataMember()> _
    Public Property Title As String
    <IgnoreDataMember()> _
    Public Property Author As String
    <DataMember()> _
    Public Property HasBeenViewed As Boolean
    <DataMember()> _
    Public Property DateViewed As Date
    <DataMember()> _
    Public Property IsPriorityArticle As Boolean
End Class

我有很多文章对象要在启动时加载。注意:在启动时加载的文章是 only 文章 - 从来没有任何新文章或任何文章被删除。 Article 对象中唯一更改的内容是 IsPriorityArticleHasBeenViewedDateViewed。其余部分是静态的。

我将这些文章加载到List(Of Article) 中,这将成为我用于绑定的数据源。当用户查看文章时,它会记录上次查看的时间和日期。 IsPriorityArticle 可能具有可由用户更改的真或假值 - 最终用户可以标记它是否被视为重要文章(在这种情况下,它将显示在优先文章的另一页中)或将其取消标记为错误的。如果是这样,则该新值需要在会话之间保持不变。

我有大约 250 篇文章。我在启动时创建了这些(同样,永远不会有更多或更少的文章)。

初始化值示例:

Public Shared Property MyArticles As IEnumerable(Of Article)

Private Sub Application_Launching(ByVal sender As Object, ByVal e As LaunchingEventArgs)
    Dim listOfArticles As New List(Of Article)
    With listOfArticles
        .Add(New Article With {.Title = "The Internet", .Author = "John", _
                               .IsPriorityArticle = False})
        .Add(New Article With {.Title = "The World", .Author = "Jim", _
                               .IsPriorityArticle = False})
        .Add(New Article With {.Title = "The Universe", .Author = "John", _
                               .IsPriorityArticle = True})
        .Add(New Article With {.Title = "The Atom", .Author = "Jim", _
                               .IsPriorityArticle = True})
    End With
    MyArticles = listOfArticles
End Sub

(顺便说一句,我知道我不再需要换行符了,但是没有它,这个网站不会格式化代码)

注意最后两个 - 他们有.IsPriorityArticle = True。这是应用程序首次启动时的初始化值 - 如果用户从不更改它,它将始终为 .IsPriorityArticle = True,但如果他们将其更改为 False,则该值应在 IsolatedStorage 中持续到下一个会话。

所以我一直在玩弄试图让它正确序列化并且无法得到任何工作。我不知道如何只从 IsoStore 加载 &lt;DataMember&gt; 属性而不是其余的。

有谁知道如何做到这一点,以便我的MyArticles As IEnumerable(Of Article) 将使用我的初始化值,然后检查任何需要更新的&lt;DataMember&gt; 属性?

还是我走错了路?

【问题讨论】:

    标签: silverlight windows-phone-7 serialization


    【解决方案1】:

    我希望我正确理解了您的问题,并且您可以理解我的回复。 (它是在 C# 中,而不是 VB)

    您可以将类装饰为数据合同:

    [DataContract(Namespace = Constants.XmlNamespace)]
    public class MyClass
    

    然后只需装饰您要序列化的每个属性:

    [DataMember]
    public string MyProperty
    

    然后,为了序列化并写入可以放在商店中的 XML 文件,您可以这样做:

    DataContractSerializer serializer = 
                            new DataContractSerializer(typeof(MyClass));
    XDocument doc = new XDocument();
    using (var writer = doc.CreateWriter())
    {
        serializer.WriteObject(writer, objectOfMyClass);
        writer.Close();
    }
    

    【讨论】:

    • 谢谢。我要做的是只序列化几个属性,而不是整个对象。我在Application_Launching 上加载变量MyArticles,方法是使用我的.Add(... 代码对其进行水合。这样做的重点是,我不会向 IsoStore 写一堆不需要的东西(如.Title 等),并希望这能加快序列化/反序列化时间。所以问题是我可以这样做吗? XML 或 DataContract 都可以序列化 - 有很大区别吗?
    • 在我看来,只要您只在要序列化的属性上使用 DataMember 装饰器,而不是全部,那么就可以序列化整个类并将其作为 XML 保存到 isoStore .我正在我的应用程序中执行此操作,还没有遇到任何问题。
    • 我很快就会试一试,但问题很快。那么当我创建一个新的MyArticles 对象并且我不序列化Title(因为它永远不会改变)时,它会在整个类中持续存在吗?
    • 不知道你说的坚持全班是什么意思?只有标记为数据成员的属性才会被序列化。如果你不将 title 标记为数据成员,那么当你序列化类时它不会被序列化。
    【解决方案2】:

    似乎没有办法部分序列化一个类,以便它使用某种JOIN,其中序列化部分附加到不需要序列化的新创建部分。序列化是类的一个实例,而不是类的任何实例。

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2021-08-25
      • 2012-03-11
      相关资源
      最近更新 更多