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

本文关键字:InvalidDataContractException 序列化 应用 应用程序 程序上 WP7 | 更新日期: 2023-09-27 18:04:18

我有一个奇怪的错误,当试图保存一个对象到孤立的存储。我有一个类,它有一些属性,代码如下:

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

我不明白为什么序列化器试图序列化我的模型的对象(这是不可序列化的),当我给它的类没有任何引用到那种类型…我错过了什么?->不,我不想添加数据合约属性类,我不需要,我不打算序列化,所以请不要回答这个:)

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

如果您在http://msdn.microsoft.com/en-us/library/hh394007(v=VS.92).aspx上完成"演练:使用MVVM使用Windows Phone"中的参考过程,可能会遇到此问题

当你要打电话的时候:

  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属性,一切都开始顺利运行……奇怪的怪异……如果有人能阐明这一点,我会很高兴(我讨厌当我解决了一个问题,但不知道确切的原因)

相关文章:
  • 没有找到相关文章