ser*_*dar 12 c# attributes xml-serialization
XmlSerializer不会序列化只读字段,只读属性(仅限于getter),私有字段等.此外,如果类没有无参数构造函数,它将不会序列化对象.我的问题:
AFAIK出现这些问题是因为在反序列化时无法访问(和更改)私有(和只读)字段.但是,如果我不反序列化怎么办?我不能选择这个吗?
由于相同的原因(反序列化问题),如果类没有无参数构造函数,它不会序列化对象.但是当我添加一个私有的无参数构造函数时,它工作正常.怎么样?
我不喜欢向每个类添加无参数构造函数,并且将所有字段设置为public和non-readonly只是为了能够序列化它.现在我在private无参数构造函数中抛出异常以防止使用.构造函数是否有一个属性告诉编译器只能对该构造函数进行授权调用?如果不是,至少我想用一个属性标记它,如果它被调用则抛出异常.
这是一个非常好的问题,我会尽力回答:
我相信setter和getter的原因是它通常假设你只有一个getter,然后它暗示它不是一个实例属性,它是派生的东西.这意味着如果你要反序列化它(我知道你没有这样做)那么你可以通过设置所有其他字段来获得这个值,因此序列化不需要关心它.
需要无参数构造函数的原因是因为将使用Reflection创建类型.可能是通过像这样的电话Activator.CreateInstace(type).这需要一个无参数的构造函数来创建实例,尽管它是公共的还是私有的并不重要.
需要实例的原因是,然后可以使用从XML检索的数据填充其上的字段.
您将需要此构造函数,但是您可以添加ObsoleteAttribute以确保它不是手动调用,或者像您一样执行并将其设置为私有.
[Obsolete(true)]
public Foo()
{
}
Run Code Online (Sandbox Code Playgroud)解决其中一些问题的一种方法可能是手动实现IXmlSerializable接口,然后您可以更好地控制序列化,但仍然需要无参数构造函数.
| 归档时间: |
|
| 查看次数: |
1793 次 |
| 最近记录: |