C# 使用XmlSerializer时,是否可以将标志枚举值标记为过时?
我见过这个[问题][1],它指的是C# 使用XmlSerializer时,是否可以将标志枚举值标记为过时?,c#,xml,xmlserializer,C#,Xml,Xmlserializer,我见过这个[问题][1],它指的是[过时(“…”),听起来像是我可能需要使用的东西。但现在我想我不行了 我有一个更新的标志枚举: [Flags] [Guid("xxxxx")] [ComVisible(true)] public enum AssignmentType { None = 0, Attendant = 1, ConductorCBS = 2, ReaderCBS = 4, Chairman = 8, Mike =
[过时(“…”)
,听起来像是我可能需要使用的东西。但现在我想我不行了
我有一个更新的标志枚举:
[Flags]
[Guid("xxxxx")]
[ComVisible(true)]
public enum AssignmentType
{
None = 0,
Attendant = 1,
ConductorCBS = 2,
ReaderCBS = 4,
Chairman = 8,
Mike = 16,
PlatformAttendant = 32,
Prayer = 64,
OCLM = 128,
Sound = 256,
Student = 512,
Custom = 1024,
Demonstration = 2048,
Assistant = 4096,
Host = 8192,
CoHost = 16384,
OCLMTreasures = 32768,
OCLMGems = 65536,
OCLMLiving = 131072
}
为了给您提供一些上下文,这些标志枚举出现在我的XML文件中,如下所示:
<Assignments Attendant="false" ConductorCBS="false" ReaderCBS="false" Chairman="false" Microphones="false" PlatformAttendant="false" Prayer="false" OCLM="false" Sound="false" Student="false" Assistant="false" Host="false" CoHost="false" OCLMTreasures="false" OCLMGems="true" OCLMLiving="false" Demonstrations="false">
所以,我想能够读懂它,但我不想写出来。那么,在这里使用[过时…]
语法是否可以接受?
[1] :最后,这就是我所需要的:
[Obsolete("Use the OCLMTreasures, OCLMGems and OCLMLiving flag values instead.")]
[XmlAttribute("OCLM")]
public bool UseForOCLMAssignments
{
get => _Assignments.HasFlag(AssignmentType.OCLM); set
{
if (value)
_Assignments |= AssignmentType.OCLM;
else
_Assignments &= ~AssignmentType.OCLM;
}
}
因此,
过时的
关键字毕竟是一种方法。序列化方法只需要获取类中的内容并转换为Xml。因此,如果有人在类中放入过时的值,您希望序列化程序做什么?它确实应该在向类添加数据的代码中修复。如果类中已经存在值,我想您希望输出为xml。@jdweng我的软件管理这个xml文件。在这个版本之前,我一直在使用那个标志。现在,向前看,我使用了三个新标志。但是我必须将枚举作为有效条目保存,否则解析器不会崩溃吗?理想情况下,我会删除这个标志,然后当我读入XML时,如果它遇到这个“未知”OCLM属性,它会将其他三个属性设置为true。但是我不知道使用XmlSerializer
是否可以这样做。您可以在类中创建一个自定义get/set,然后在get/set中添加代码。看下面:@jdweng我真的不明白。我已经按照我向您展示的方式定义了我的对象。
[XmlAttribute("OCLM")]
public bool UseForOCLMAssignments
{
get => _Assignments.HasFlag(AssignmentType.OCLM); set
{
if (value)
_Assignments |= AssignmentType.OCLM;
else
_Assignments &= ~AssignmentType.OCLM;
}
}
[Obsolete("Use the OCLMTreasures, OCLMGems and OCLMLiving flag values instead.")]
[XmlAttribute("OCLM")]
public bool UseForOCLMAssignments
{
get => _Assignments.HasFlag(AssignmentType.OCLM); set
{
if (value)
_Assignments |= AssignmentType.OCLM;
else
_Assignments &= ~AssignmentType.OCLM;
}
}