Сериализация только некоторых свойств? - PullRequest
1 голос
/ 09 марта 2012

Я работаю в Windows Phone 7, но я полагаю, что вопрос может быть о Silverlight в целом (но не .NET, поскольку ISerializable не существует в Windows Phone, как предлагается в этом ответе ).

У меня есть ряд объектов, которые я создаю во время выполнения. В большинстве случаев они всегда будут одинаковыми, за исключением нескольких свойств.

Итак, я бы имел в качестве объекта:

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

У меня много объектов article для загрузки при запуске. Примечание. Статьи, загружаемые при запуске, - это статьи only - новые статьи и статьи никогда не удаляются. В объекте Article изменяются только IsPriorityArticle, HasBeenViewed и DateViewed. Все остальное статично.

Я загружаю эти статьи в List(Of Article), и это становится моим источником данных для привязки. Когда пользователь просматривает статьи, он регистрирует время последнего просмотра и эту дату. IsPriorityArticle может иметь значение true или false, которое может быть изменено пользователем - конечный пользователь может пометить, если он считается важной статьей (в этом случае он будет отображаться на другой странице приоритетных статей), или отменить его как ложный. Если это так, это новое значение должно сохраняться между сеансами.

У меня около 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

(Кстати, я знаю, что мне больше не нужен символ продолжения строки, но этот сайт не будет форматировать код без него)

Обратите внимание на последние 2 - у них есть .IsPriorityArticle = True. Это инициализированное значение при первом запуске приложения - если пользователь никогда не изменяет его, оно всегда будет .IsPriorityArticle = True, но если они изменят его на False, оно должно сохраняться в IsolatedStorage до следующего сеанса.

Так что я пытался заставить его сериализоваться правильно и не мог заставить что-либо работать. Я не знаю, как загрузить только свойства <DataMember> из IsoStore, а не остальные.

Кто-нибудь знает, как это сделать, чтобы мой MyArticles As IEnumerable(Of Article) использовал мои инициализированные значения, а затем проверил наличие <DataMember> свойств, которые необходимо обновить?

Или я иду по неверному пути?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Надеюсь, я правильно понял ваш вопрос, и вы можете понять мой ответ. (Это на 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();
}
0 голосов
/ 13 марта 2012

Похоже, что нет возможности частично сериализовать класс, чтобы он использовал какой-то вид JOIN, в котором сериализованная часть присоединяется к вновь созданной части, которая не нуждается в сериализации.Сериализация относится к экземпляру класса, а не к экземпляру класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...