InvalidDataContractException в приложении WP7 для класса, который является сериализуемым - PullRequest
1 голос
/ 31 июля 2011

У меня странная ошибка при попытке сохранить объект в изолированном хранилище. У меня есть класс, который имеет некоторые свойства, вот код:

[DataContract]
    public class ExerciseStatistic
    {
        [XmlIgnore]
        public int CorrectAnswers
        {
            get
            {
                return Attempts.Where(a => a.AttemptAnswerIsCorrect).Count();
            }
        }

        [XmlIgnore]
        public int IncorrectAnswers
        {
            get
            {
                return Attempts.Where(a => !a.AttemptAnswerIsCorrect).Count();
            }
        }

        [XmlIgnore]
        public int AnswerAttempts
        {
            get { return Attempts.Count; }
        }

        public List<AnswerAttempt> Attempts { get; set; }

        public ExerciseStatistic()
        {
            Attempts = new List<AnswerAttempt>();
        }
    }

    public class AnswerAttempt
    {
        public DateTime AttemptDate { get; set; }
        public string AttemptTargetName { get; set; }
        public string AttemptName { get; set; }
        public bool AttemptAnswerIsCorrect { get; set; }
    }

Однако, при попытке сохранить его с этим предложением:

IsolatedStorageSettings.ApplicationSettings["a"] = new ExerciseStatistic()
                                                {
                                                    Attempts = new List<AnswerAttempt>()
                                                                                {
                                                                                    new AnswerAttempt()
                                                                                        {
                                                                                            AttemptAnswerIsCorrect = true,
                                                                                            AttemptDate = DateTime.Now,
                                                                                            AttemptName = "lala",
                                                                                            AttemptTargetName = "lala2"
                                                                                        },
                                                                                    new AnswerAttempt()
                                                                                        {
                                                                                            AttemptAnswerIsCorrect = false,
                                                                                            AttemptDate = DateTime.Now,
                                                                                            AttemptName = "lalab",
                                                                                            AttemptTargetName = "lalab2"
                                                                                        }
                                                                                }
                                                };

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

Тип 'XX.Model.FirstClass.SecondClass' не может быть сериализован. Рассматривать пометить его атрибутом DataContractAttribute и пометить все его членов, которые вы хотите сериализовать с DataMemberAttribute атрибут.

Я не понимаю, почему сериализатор пытается сериализовать объект моей модели (который не сериализуем), когда класс, который я ему даю, не имеет ссылок на этот тип типа ... что я скучаю? -> Нет, я не хочу добавлять атрибуты datacontract к классам, которые мне не нужны и не планируют сериализоваться, поэтому, пожалуйста, не отвечайте так:)

Ответы [ 3 ]

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

Вы можете столкнуться с этой проблемой, если будете работать со справочной процедурой в «Пошаговом руководстве: использование OData с MVVM для Windows Phone» на http://msdn.microsoft.com/en-us/library/hh394007(v=VS.92).aspx

Когда вы доберетесь до точки, где вы звоните:

  Return DataServiceState.Serialize(_context, collections);

Вы можете получить InvalidDataContractException с сообщением:

Тип 'DataBoundApp1.Northwind.NorthwindEntities' не может быть сериализован.Попробуйте пометить его атрибутом DataContractAttribute, а все его элементы, которые вы хотите сериализовать, пометить атрибутом DataMemberAttribute.

Благодаря ответу Даниэля Переса мне удалось решить эту проблему, и я документируюМои шаги, чтобы прояснить решение для других:

  1. Показать скрытые файлы в обозревателе решений
  2. Откройте файл «Reference.cs» (в разделе «Справочник по услугам» разверните файл Reference.datasvcmap)
  3. Если в вашем классе контекста службы данных отсутствует атрибут [DataContract], добавьте его, как показано здесь:

.

namespace OCC.WindowsPhone.OrlandoCodeCampService
{    
    [DataContract]  <--- I ADDED THIS
    public partial class OrlandoCodeCampEntities : global::System.Data.Services.Client.DataServiceContext
    {..}

Как только я добавил атрибут DataContract, проблема исчезла!

0 голосов
/ 01 августа 2011

Я не думаю, что это правильный ответ, но это то, что я должен был сделать, чтобы это исправить. После изменения кода я понял, что ДАЖЕ не получится, если я ничего не буду сохранять в изолированном хранилище. Простое объявление атрибута DataContract для типа привело к возникновению ошибки. Я должен думать, что инфраструктура WP7 в какой-то момент анализирует все классы, имеющие этот атрибут, и по какой-то странной и неясной причине (которую я не могу найти) она ищет их и в других классах. Я добавил атрибуты DataContract в классы, которые компилирует фреймворк, а также некоторые атрибуты KnownType, и все стало работать гладко ... странно ... если кто-то может пролить свет на это, я бы счастлив (я ненавижу, когда решаю проблему, но не зная точной причины)

0 голосов
/ 31 июля 2011

Мне кажется, вы пытаетесь исключить свойства из сериализации, используя XmlIgnore.

Из документации :

Вы можете отказаться от членов от сериализации, используя атрибут IgnoreDataMemberAttribute.

, поэтому попробуйте использовать IgnoreDataMemberAttribute вместо XmlIgnore, чтобы отказаться от членов из сериализации.

У меня также были некоторые проблемы с DataContract в той же ситуации, что и у вас, поэтому я вернулся к простой старой XML-сериализации в строки, которые я затем сохранил в изолированном хранилище. Это также облегчает отладку.

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