【发布时间】:2018-04-08 07:05:43
【问题描述】:
下面的类是一个人为的例子。我想要在每次序列化时将“isVisible”字段序列化为“true”的最简单方法......不管它设置为什么。
在实际代码中...这是一个更大的对象,并且有几个不同的构造函数,它们从不同的点调用。
现在,我能想到两种方法。
创建一个“OnSerializing()”方法,该方法在序列化期间使用反射将属性设置为“true”。 (我实际上不确定这是否会奏效……但似乎会奏效)。
-
在启动类序列化的方法中...在序列化之前创建所有 isVisible 为“真”的新项目。
[DataContract] public class MapItem { public MapItem(bool isVisible) { this.isVisible = isVisible; } [DataMember] private readonly bool isVisible; public bool IsVisible => isVisible; }
我为什么需要这个?基本上,我需要加载这些项目并让它们在加载后始终直接可见。在运行应用程序时... MapItems 可能会变得可见/不可见。因此,我希望 XML 始终具有 <isVisible>true</isVisible> 或者我希望 MapItem 中的值仅在反序列化时为“真”。
【问题讨论】:
-
我想要在每次序列化时将 'isVisible' 字段序列化为 'true' 的最简单方法 -- 你的意思是你希望
<isVisible>true</isVisible>出现在序列化的 XML,或者您希望在序列化期间将MapItem类中的实际字段值修改为true? -
如果你总是希望它是
true,为什么你可以选择它是假的?你真的需要序列化它吗?您可以将其默认为 true 并使用IgnoreDataMemberAttribute忽略IsVisible吗? -
@dbc 是的,我希望 XML 始终具有
true 或者我希望 MapItem 中的值仅在反序列化时为“true”。基本上,我需要加载这些项目并让它们在加载后始终直接可见。运行应用程序时...地图项可能会变得可见/不可见。 -
@TyCobb 如上所述。在运行应用程序时,这些项目可能可见或不可见。只有在加载时,我才需要将它们全部设置为可见。但是,我认为这样做更省时的方法是将它们保存为可见而不是以这种方式加载它们。
-
这里的基本问题是
DataContractSerializerdoesn't call your constructor,因此您没有方便的方法将只读bool字段初始化为true。你愿意将字段的含义从isVisible翻转到isNotVisible吗?在这种情况下,默认值将是正确的值。
标签: c# serialization datacontractserializer