2011-01-01 4 views
1

У меня есть этот небольшой метод в библиотеке классов, который хранится во внешней dll, вдали от приложения «клиент».Является ли это ошибкой сериализации или ошибкой контракта данных

public void SaveToDisk() 
    { 
     // Create a storage container and save 
     // this instance to it. Use "this" storage name. 
     var settingsToStore = this; 
     var settings = IsolatedStorageSettings.ApplicationSettings; 
     settings[StorageName] = settingsToStore; 
     settings.Save(); 
    } 

По существу, он хранится на телефонах с изолированным хранилищем. Класс, который содержит это, не отмечен никакими атрибутами. Ошибки я получаю это:

ех { "Тип„CabbageWrapper.Account“ не может быть сериализовать Рассмотрим маркировку его с DataContractAttribute атрибута, и маркировка всех его членов вы хотите сериализованная с . DataMemberAttribute атрибут. "} System.Exception {System.Runtime.Serialization.InvalidDataContractException}

Я хотел бы знать, что означает, что ошибка, а не просто добавление атрибутов и молясь, чтобы это ее RKS. Благодаря!

EDIT: В соответствии с запросом, класс в полном объеме.

using System.IO.IsolatedStorage; 

public class Account 
{ 

    public string Provider { get; private set; } 

    public string ServerSymbol { get; private set; } 

    public int MessageCharAllowance { get; private set; } 

    public int RemainingWebtextAllowance { get; set; } 

    public int WebtextAllowance { get; private set; } 

    public string Username { get; private set; } 

    public string Password { get; private set; } 

    public string StorageName { get; private set; } 

    public Account(string provider, string storageName, string username, string password) 
    { 
     // Assign the values to "this" instance. 
     Provider = provider; 
     Username = username; 
     Password = password; 
     StorageName = storageName; 

     // Load the ServerSymbol and WebtextAllowance from 
     // the libraries resources. These are known values. 
     PopulateKnownData(); 

     // Save to disk 
     SaveToDisk(); 
    } 


    public Account(string storageName) 
    { 
     // We need to know the name of the storage 
     // container to perform the load. Get it 
     // from the caller and save it to "this" instance. 
     StorageName = storageName; 

     // Perform the load. 
     LoadFromDisk(); 
    } 


    private void PopulateKnownData() 
    { 
     switch (Provider) 
     { 
      case "Vodafone": 
       ServerSymbol = "v"; 
       WebtextAllowance = 600; 
       RemainingWebtextAllowance = -1; 
       break; 

      case "O2": 
       ServerSymbol = "o"; 
       WebtextAllowance = 250; 
       RemainingWebtextAllowance = -1; 
       break; 

      case "Meteor": 
       ServerSymbol = "m"; 
       WebtextAllowance = 250; 
       RemainingWebtextAllowance = -1; 
       break; 

      case "Three": 
       ServerSymbol = "t"; 
       WebtextAllowance = 333; 
       RemainingWebtextAllowance = -1; 
       break; 

      default: 
       break; 
     } 
    } 


    public void LoadFromDisk() 
    { 
     // Create a dummy account for rehydration and 
     // use it to grab the stored account from memory. 
     Account storedAccount; 
     IsolatedStorageSettings.ApplicationSettings.TryGetValue(StorageName, out storedAccount); 

     // Use the stored details to hydrate this instance. 
     Provider = storedAccount.Provider; 
     ServerSymbol = storedAccount.ServerSymbol; 
     RemainingWebtextAllowance = storedAccount.RemainingWebtextAllowance; 
     WebtextAllowance = storedAccount.WebtextAllowance; 
     MessageCharAllowance = storedAccount.MessageCharAllowance; 
     Username = storedAccount.Username; 
     Password = storedAccount.Password; 
    } 


    public void SaveToDisk() 
    { 
     // Create a storage container and save 
     // this instance to it. Use "this" storage name. 
     var settingsToStore = this; 
     var settings = IsolatedStorageSettings.ApplicationSettings; 
     settings[StorageName] = settingsToStore; 
     settings.Save(); 
    } 
} 
+0

Нам нужно увидеть класс CabbageWrapper.Account, чтобы узнать, почему его невозможно сериализовать. –

+0

Хорошо, я отредактирую. – deanvmc

ответ

1

Сообщение об исключении довольно само собой разумеется. Украшая элементы этими атрибутами, вы указываете сериализатору, какие элементы сериализуются (большую часть времени вы хотите сериализовать только некоторые члены, а не все в своем классе). Причина, по которой вы должны определить их, - это просто то, что вы можете решить, что сериализовать, а что нет. Есть также соображения производительности, безопасности и т. Д., Поэтому это причина, по которой она не выполняется по умолчанию. Прочитайте http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx «Примените атрибут DataContractAttribute к классам и атрибут DataMemberAttribute для членов класса, чтобы указать свойства и поля, которые сериализованы».

+0

Я думаю, вы пропустили точку вопроса, почему. Почему этот способ, а не просто декорирование как сериализуемое, я хотел бы знать, что означает ошибка, а не просто добавлять атрибуты и молиться, чтобы это сработало. – deanvmc

+0

@DeanMC: в .net есть много сериализаторов, поэтому добавлены новые атрибуты, то есть некоторые сериализаторы используют разные атрибуты, чем другие. –

+0

Я действительно ценю, что вы нашли время, чтобы ответить, но это дополнение похоже на то, что WP7 использует компактную структуру, потому что другие версии не будут делать. Я понимаю, что это другой сериализатор, я не понимаю, почему. Почему XML-сериализатор (из того, что я читал). Почему бы не просто двоичный сериализатор. Должен ли я использовать это только для обычного сериализатора. Я пытаюсь понять проблемы, а не просто решить эту проблему. – deanvmc

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