【问题标题】:Type is not serializable because it's not public?类型不可序列化,因为它不是公共的?
【发布时间】:2015-06-04 16:50:54
【问题描述】:

我有一个无法正确序列化的公共类。尝试时,会抛出以下异常:

数据协定类型“MyProject.MyClass”不可序列化,因为它不是公共的。公开类型将修复此错误。或者,您可以将其设为内部,并在程序集上使用 InternalsVisibleToAttribute 属性以启用内部成员的序列化 - 有关更多详细信息,请参阅文档。请注意,这样做有一定的安全隐患。

不过,我的班级公开的:

[DataContract]
public class MyClass
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    private int Count;

    public MyClass()
    {
        Name = string.Empty;
        Count = 0;
    }
}

当课程明确公开时,为什么我会收到此异常?

【问题讨论】:

    标签: c# windows-phone-7


    【解决方案1】:

    在 Windows Phone 7 应用中,您不能序列化私有成员:

    好吧,碰巧 WP7 应用程序在“部分信任”环境和“完全信任”之外运行,DataContractSerializer 拒绝序列化或反序列化非公共成员。当然,这个例外在 .NET 内部被吞没了,所以我所看到的只是关于我肯定知道是公开的事情是“不公开的”的奇怪消息。我将所有要序列化的私有字段更改为公共字段,一切正常。 http://geekswithblogs.net/mikebmcl/archive/2010/12/29/datacontractserializer-type-is-not-serializable-because-it-is-not-public.aspx

    更改代码以避免序列化私有成员可以解决问题。

    【讨论】:

      【解决方案2】:

      您可以通过为此类编写自定义序列化来解决此问题。内置的 XML 序列化只能序列化公共属性。

      您可以执行以下操作之一来解决此限制:

      • 删除Count 上的DataMember 属性
      • 公开Count
      • 实现IXmlSerializable(或您需要的任何其他序列化),并手动序列化这些私有成员

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-14
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 2021-11-27
        • 2018-11-22
        • 2017-04-22
        相关资源
        最近更新 更多