繁体   English   中英

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

[英]InvalidDataContractException on WP7 application on class that is serializable

尝试将对象保存到隔离存储中时出现一个奇怪的错误。 我有一个具有一些属性的类,这是代码:

[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属性添加到我不需要的类中,也不想计划进行序列化,所以请不要回答这个问题:)

如果您通过http://msdn.microsoft.com/zh-cn/library/hh394007(v=VS.92)中的“演练:使用MVVM for Windows Phone使用OData”中的参考过程进行操作,则可能会遇到此问题。 aspx

当您到达要点时:

  Return DataServiceState.Serialize(_context, collections);

您可能会收到一条InvalidDataContractException消息:

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

感谢Daniel Perez的回答,我得以解决此问题,并且正在记录我的步骤以为其他人阐明解决方案:

  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属性后,问题就消失了!

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

文档中

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

因此请尝试使用IgnoreDataMemberAttribute而不是XmlIgnore从序列化中退出成员。

在与您相同的情况下,我也遇到了DataContract麻烦,因此我恢复了将普通的XML序列化为字符串,然后将其存储在隔离的存储中。 这也简化了调试。

我认为这不是一个正确的答案,但这是我必须解决的问题。 更改了一些代码后,我意识到即使我没有将任何内容保存到隔离存储中,这也将失败。 只需在类型上声明DataContract属性,就会产生错误。 我必须认为WP7的框架有时会解析具有该属性的所有类,并且出于某些奇怪和晦涩的原因(我找不到),它也在其他类中也在寻找它们。 我在框架所涉及的类中添加了DataContract属性,还添加了一些KnownType属性,并且一切开始平稳运行...怪异的怪异...如果有人可以对此有所了解,我会快乐(当我解决问题但不知道确切原因时,我讨厌它)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM