我有一个不能正确序列化的公共类。尝试时,抛出以下异常:
数据协定类型“MyProject.MyClass”不可序列化,因为它不公开。将类型设置为public将修复此错误。或者,您可以将其设置为内部,并使用程序集上的InternalsVisibleToAttribute属性以启用内部成员的序列化 - 有关更多详细信息,请参阅文档。请注意,这样做会产生一定的安全隐患。
我的班级 是公开的,但是:
[DataContract]
public class MyClass
{
[DataMember]
public string Name { get; set; }
[DataMember]
private int Count;
public MyClass()
{
Name = string.Empty;
Count = 0;
}
}
为什么我在班级显然公开时会得到这个例外?
答案 0 :(得分:8)
在Windows Phone 7应用中,您无法序列化私人成员:
嗯,只是碰巧WP7应用程序在“部分信任”环境中运行并且在“完全信任”之外 - DataContractSerializer拒绝序列化或反序列化非公共成员。当然这个异常被.NET内部吞噬了,所以我所看到的只是那些我所知道的事情的奇怪信息是公开的“不公开”。我将所有序列化的私有字段更改为public,一切正常。 http://geekswithblogs.net/mikebmcl/archive/2010/12/29/datacontractserializer-type-is-not-serializable-because-it-is-not-public.aspx
更改代码以避免序列化私有成员可以解决问题。
答案 1 :(得分:2)
您可以通过为此类编写自定义序列化来解决此问题。内置的XML序列化只能序列化公共属性。
您可以执行以下操作之一来解决此限制:
DataMember
Count
属性
Count
公开IXmlSerializable
(或您需要的任何其他序列化),并手动序列化这些私有成员