gpt4 book ai didi

c# - 如何使标志枚举在 C# 中以数字方式序列化其组合值?

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:03 24 4
gpt4 key购买 nike

假设您在 C# 中有一个标志枚举:

[Flags]
public enum FlagsEnum
{
One = 0x1,
Two = 0x2,
Four = 0x4,
...
}

如果您通过标准的 JSON 或 XML 序列化运行它,FlagsEnum.One 将被序列化为字符串 OneFlagsEnum.TwoTwo 等。如果您想将其更改为将值序列化为整数 12 等,一个典型的解决方案是枚举一般是使用EnumMember属性或者XmlEnum属性。

问题是,对于标志枚举,您期望使用几个未明确声明的数值。谷歌搜索似乎并没有为这种情况找到太多解决方案。那么,如何将这样的内容序列化为不仅仅是 2 的幂的整数值,以序列化形式显示内容,如 2315 等。 ?

编辑

我正在寻找的部分内容是一种在枚举本身内指定它的方法,而无需向枚举添加任何额外值或向其他类型添加属性。然而,我心中有一个疑问,这是否真的可能(基本上来说)。

目前真正提出的主要序列化程序类型是 DataContractSerializer。无论多么典型,标准的 JSON 内容也适用于这个问题,目标是避免更改序列化程序本身并使用任何客户或人迹罕至的地方。 (属性和东西会很好,如果可以那样做的话。)

最佳答案

开箱即用的序列化允许保存和恢复标记的枚举值:

<foo>Two Four</foo>

但使用 XML 中的字符串值

要将其保存为 int 解释,您可以创建一个 int 属性并将其序列化

[XmlIgnore]
public FlagsEnum foo{get;set;}
public int bar
{
get{ return (int)foo;}
set{ foo = (FlagsEnum)value;}
}

在那种情况下,您的 XML 将具有 int 值并且对象将具有完整的枚举数据

对于 DataContractSerializerXmlSerializer 可以使用 IXmlSerializable 接口(interface)实现的选项,但是对于大类来说有点过分了

public void ReadXml(XmlReader reader)
{
while (reader.Read())
{
if (reader.Name == "foo")
{
foo = (FlagsEnum)reader.ReadElementContentAsInt();
}
}
}

public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("foo", ((int)foo).ToString());
}

关于c# - 如何使标志枚举在 C# 中以数字方式序列化其组合值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674601/

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