2014-07-08 33 views
9

XmlSerializer不会序列化只读字段,只读属性(仅与getter),私有字段等。另外,如果类没有无参数构造函数,它将不会序列化对象。我的问题,为什么我不能用XmlSerializer序列化只读字段?

1)AFAIK出现这些问题是因为私有(和只读)字段无法访问(和更改),而deserilization。但是如果我不进行反序列化呢?难道我没有这个选择吗?

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

3)我不喜欢为每个类添加一个无参数构造函数,并且为了能够序列化它而使所有的字段成为公共的而非只读的。现在我在私有无参数构造函数中抛出异常以防止使用。是否有构造函数的属性告诉编译器只有授权的调用才能被构造函数使用?如果不是,至少我想用一个抛出异常的属性标记它,如果它被调用。

+0

1,2)我认为原因是稍后序列化的点是反序列化。这就像你想把东西放在你的旅行箱里,尽管你知道机场安全不会让你回到你身边。 3)你认为'授权'电话是什么意思?来自课堂本身的电话? –

+0

@KamilT通过“授权呼叫”我的意思是,例如,只允许来自特定方法的呼叫(或根本不允许)。对于这个问题'Obsolote'解决了我的问题。 – serdar

回答

5

这是相当一个很好的问题,我会尽我所能回答:

1)相信对于二传手以及吸气的原因是,它通常假设,如果你只得到了一getter然后它暗示它不是一个实例属性,它是派生的东西。这意味着如果你要反序列化它(我知道你没有这样做),那么你可以通过设置所有其他字段来获得这个值,因此序列化不需要关心它。

2)无参数构造函数是必需的原因是因为类型将使用反射创建。可能通过像Activator.CreateInstace(type)这样的电话。这需要一个无参数的构造函数来创建实例,但它可能无关紧要,如果它是公共的或私有的。

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

3)您需要这个构造函数,但是您可以添加ObsoleteAttribute以确保它不是手动调用,或者像您在做的那样做并使其变为私有。周围的一些问题的工作

[Obsolete(true)] 
public Foo() 
{ 

} 

一种方式可以是手动实现IXmlSerializable接口,那么你就有了序列化更精细的控制,但将仍然需要参数的构造函数。

+0

关于nr'3' - 不会'过时(true)'阻止对该函数的所有调用?即使是“授权”(仍在等待OP的定义)方式? –

+1

@KamilT:如果他只是在序列化之前添加它,它应该可以正常工作,因为它会产生编译错误而不是运行时错误。由于代码中不会直接调用,所以在构建时不应该是一个问题。 – Ian

+0

感谢您的解释,+1为你 –

相关问题