gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:47:20 24 4
gpt4 key购买 nike

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

  1. 据我所知,这些问题的出现是因为在反序列化时无法访问(和更改)私有(private)(和只读)字段。但是如果我不反序列化呢?我没有这个选项吗?

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

  3. 我不喜欢为每个类都添加一个无参数构造函数,并将所有字段设为公共(public)和非只读,只是为了能够对其进行序列化。现在我在私有(private)无参数构造函数中抛出异常以防止使用。构造函数是否有一个属性告诉编译器只能对该构造函数进行授权调用?如果不是至少我想用一个属性来标记它,如果调用它会抛出异常。

最佳答案

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

  1. 我认为使用 setter 和 getter 的原因是,如果您只有一个 getter,通常会假设它不是实例属性,而是派生的东西。这意味着如果您要反序列化它(我知道您没有这样做),那么您可以通过设置所有其他字段来导出该值,因此序列化不需要关心它。

    <
  2. 之所以需要无参数构造函数是因为类型将使用反射创建。可能是通过 Activator.CreateInstace(type) 这样的调用。这需要一个用于创建实例的无参数构造函数,尽管它是公共(public)的还是私有(private)的可能并不重要。

    需要该实例的原因是它的字段可以用从 XML 检索到的数据填充。

  3. 您将需要此构造函数,但您可以添加 ObsoleteAttribute以确保它不会被手动调用,或者按照您的操作将其设为私有(private)。

    [Obsolete(true)]
    public Foo()
    {

    }

解决其中一些问题的一种方法可能是实现 IXmlSerializable手动接口(interface),那么您可以更好地控制序列化,但仍然需要无参数构造函数。

关于c# - 为什么我不能使用 XmlSerializer 序列化只读字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com