2012-03-08 2 views
1

Я работаю в 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 

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

Я загружаю эти статьи в 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 

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

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

Итак, я поиграл с попыткой получить это для правильной сериализации и не может заставить ничего работать. Я не знаю, как загрузить только объекты <DataMember> из IsoStore, а не остальные.

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

Или я ошибаюсь по этому пути?

ответ

0

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

1

Надеюсь, я правильно понял ваш вопрос, и вы можете понять мой ответ.(Это в C#, а не VB)

Вы можете украсить класс как DataContract:

[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

Спасибо. Я хочу сделать сериализацию только нескольких свойств, а не всего объекта. Я загружаю переменную 'MyArticles' в' Application_Launching', увлажняя ее с помощью кода '.Add (...'. Точка в том, что я хочу сделать это, так что я не пишу кучу вещей в IsoStore, t должен быть там (например, '.Title' и т. д.), и, надеюсь, это ускорит время сериализации/десериализации. Поэтому вопрос: могу ли я это сделать так? XML или DataContract оба подходят для сериализации - есть ли много разница? – Stan

+1

По-моему, если вы используете рекламодателя DataMember только для свойств, которые вы хотите сериализовать, а не для всех из них, то вполне нормально сериализовать весь класс и сохранить его как XML в isoStore. делаю это в своем приложении, и я еще не сталкивался с какими-либо проблемами. – evasilchenko

+0

Я скоро отправлю это, но быстро вопрос. Поэтому, когда я создаю новый объект 'MyArticles', и я не сериализую' Title', (потому что он никогда не меняется), будет ли он сохраняться во всем классе? – Stan

Смежные вопросы