为什么我不能用XmlSerializer序列化只读字段?

时间:2014-07-08 07:59:45

标签: c# attributes xml-serialization

XmlSerializer不会序列化只读字段,只读属性(仅限getter),私有字段等。此外,如果类没有无参数构造函数,它将不会序列化对象。我的问题:

  1. AFAIK出现这些问题是因为在反序列化时无法访问(和更改)私有(和只读)字段。但是,如果我不反序列化怎么办?我不能选择这个吗?

  2. 由于相同的原因(反序列化问题),如果类没有无参数构造函数,它不会序列化对象。但是当我添加一个私有的无参数构造函数时,它工作正常。怎么样?

  3. 我不想在每个类中添加无参数构造函数,并且只是将所有字段设置为public和non-readonly才能序列化它。现在我在private无参数构造函数中抛出异常以防止使用。构造函数是否有一个属性告诉编译器只能对该构造函数进行授权调用?如果不是,至少我想用一个属性来标记它,如果它被调用则抛出异常。

1 个答案:

答案 0 :(得分:6)

这是一个非常好的问题,我会尽力回答:

  1. 我认为设定者和吸气剂的原因在于,如果你只有一个吸气剂,它通常会被假设,那么它暗示它不是一个实例属性,它是衍生出来的东西。这意味着如果你要反序列化它(我知道你没有这样做)那么你可以通过设置所有其他字段来获得这个值,因此序列化不需要关心它。

  2. 需要无参数构造函数的原因是因为将使用Reflection创建类型。可能通过像Activator.CreateInstace(type)之类的电话。这需要一个无参数的构造函数来创建实例,尽管如果它是公共的或私有的可能并不重要。

    需要实例的原因是,然后可以使用从XML检索的数据填充其上的字段。

  3. 您需要使用此构造函数,但是您可以添加ObsoleteAttribute以确保不会手动调用它,或者像您一样进行并将其设为私有

    [Obsolete(true)]
    public Foo() 
    {
    
    }
    
  4. 解决其中一些问题的一种方法可能是手动实现IXmlSerializable接口,然后您可以更好地控制序列化,但仍然需要无参数构造函数。