对可序列化的类上的WP7应用程序的InvalidDataContractException

时间:2011-07-31 16:47:11

标签: c# windows-phone-7 xml-serialization datacontract

尝试将对象保存到独立存储区时,我遇到了一个奇怪的错误。我有一个有一些属性的类,这里是代码:

[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序列化的成员数   属性。

我不明白为什么序列化程序试图序列化我的模型的对象(这是不可序列化的)当我给它的类没有任何对这种类型的引用时......我错过了吗? - &GT;不,我不想将datacontract属性添加到我不需要的类,并且不打算序列化,所以请不要回答:)

3 个答案:

答案 0 :(得分:1)

如果您在http://msdn.microsoft.com/en-us/library/hh394007(v=VS.92).aspx

中完成“演练:使用MVVM for Windows Phone消费OData”中的参考过程,则可能会遇到此问题

当你到达你打电话的地方时:

  Return DataServiceState.Serialize(_context, collections);

您可能会收到带有消息的InvalidDataContractException:

类型'DataBoundApp1.Northwind.NorthwindEntities'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。

感谢Daniel Perez的回答,我能够解决这个问题,并且正在记录我为其他人澄清解决方案的步骤:

  1. 在解决方案资源管理器中显示隐藏文件
  2. 打开文件“Reference.cs”(在您的服务参考下,展开 Reference.datasvcmap)
  3. 如果您的数据服务上下文类缺少[DataContract] 属性,如下所示添加:
  4. namespace OCC.WindowsPhone.OrlandoCodeCampService
    {    
        [DataContract]  <--- I ADDED THIS
        public partial class OrlandoCodeCampEntities : global::System.Data.Services.Client.DataServiceContext
        {..}
    

    一旦我添加了DataContract属性,问题就消失了!

答案 1 :(得分:0)

在我看来,您尝试使用XmlIgnore从序列化中排除属性。

来自documentation

  

您可以使用IgnoreDataMemberAttribute从序列化中选择退出成员。

因此,请尝试使用IgnoreDataMemberAttribute而不是XmlIgnore来禁止成员进行序列化。

我也遇到了DataContract在与你完全相同的情况下遇到的麻烦,因此我将原来的旧XML序列化转换为字符串,然后将其存储在独立存储中。这也简化了调试。

答案 2 :(得分:0)

我不认为这是一个正确的答案,但这是我必须做的才能解决它。 在更改了一些代码之后,我意识到如果我没有将任何东西保存到隔离存储器中,那就失败了。只是在类型上声明DataContract属性就会出错。我必须认为WP7的框架在某种程度上是在解析所有具有这个属性的类,并且由于一些奇怪和模糊的原因(我找不到),它也在其他类中寻找它们。我在框架所抱怨的类中添加了DataContract属性,并且还添加了一些KnownType属性,并且一切都开始顺利运行......奇怪怪异......如果有人可以对此有所了解,我会快乐(当我解决问题但不知道确切的原因时,我讨厌它)