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序列化的成员属性。
我不明白为什么序列化器试图序列化我的模型的对象(这是不可序列化的),当我给它的类没有任何引用到那种类型…我错过了什么?->不,我不想添加数据合约属性类,我不需要,我不打算序列化,所以请不要回答这个:)
如果您在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的回答,我能够解决这个问题,我正在记录我的步骤,以便为其他人澄清解决方案:
- 在解决方案资源管理器中显示隐藏文件
- 打开"Reference.cs"文件(在您的服务引用下,展开)Reference.datasvcmap)
- 如果你的数据服务上下文类缺少[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属性,一切都开始顺利运行……奇怪的怪异……如果有人能阐明这一点,我会很高兴(我讨厌当我解决了一个问题,但不知道确切的原因)