【问题标题】:Enum not serializing枚举不序列化
【发布时间】:2012-05-22 07:14:18
【问题描述】:

我有 WCF 服务。 它绑定到一个 MSMQ,但这不是这里的问题。 我可以序列化一个对象,该对象具有基类和在基类中实现的接口,具体类派生自基类 - 这很好。

然而,当我在基类中有一个枚举并设置了该值,然后在它被反序列化/从 MSMQ 读取之后,该值仍设置为默认值(即不是在代码中手动设置的值)

有什么想法吗?我什至将枚举标记为 DataContract,并将每个 Enum 成员都标记为 EnumMember 属性。

如何序列化枚举?

【问题讨论】:

  • 您是否还用DataMember标记了您要转让的财产?
  • 禁用仅我的代码,并在所有 CLR 异常上启用中断,然后您应该会看到一些内部序列化异常,告诉您出了什么问题。默认情况下,这永远不会记录在任何地方,所以这是我知道的唯一确定的方法来获取隐藏的真正异常。
  • 理查德:没有例外。我做了你之前说的,什么也没做……尖叫——是的,我当然做了。适用于类中的所有内容(其他对象和值类型(即整数))但不适用于枚举
  • 你能把你的课程贴在这里吗?你能缩小范围到中断的领域吗?它只是一个有 1 个枚举成员的类吗?还有——你的序列化代码是什么?

标签: c# wcf msmq


【解决方案1】:

我使用这个,它适用于公共枚举:

[Serializable]
public enum EnumToSerialize
{
    [EnumMember]
    One = 1,
    [EnumMember]
    Two = 2
}

【讨论】:

    【解决方案2】:

    财产受到保护。将其设置为 Public 和 viola - 序列化 enum 属性。有点糟糕,因为该物业位于低音类中....而是对其进行保护

    【讨论】:

    • Enum DataContract 的定义必须对序列化程序公开。然而,被序列化的属性可以是任何级别的保护:私有、内部等。
    • 不是根据我所做的测试。如果我为该枚举类型声明已知类型属性,并将枚举属性设置为受保护,则将该属性值更改为不同的枚举不会被序列化。但是,如果我将该访问级别保护更改为公开,那么它才会起作用。
    【解决方案3】:

    MSDN 上试试这篇文章。这个例子似乎能够设置一个带有枚举的属性并将其序列化。在反序列化对象时,您应该能够取回相同的值。

    【讨论】:

    • 谢谢艾米。试过了,不行,但我只是设法找到了问题!我必须将基类中的受保护属性公开 - 然后将其序列化!嗯。
    • 是的。该示例显示属性必须是公共的。编码愉快!
    • 谢谢。不过,我发现有趣的是,如果属性受到包括 DateTime 结构在内的其他数据类型的保护,它可以很好地序列化......但枚举似乎是一种特殊情况......
    • 请注意,示例中的枚举是公共​​的,但使用枚举的属性是内部的。我相信这可能会奏效。 [DataContract] public enum Position { [EnumMember(Value = "Emp")] Employee, [EnumMember(Value = "Mgr")] Manager, [EnumMember(Value = "Ctr")] Contractor, NotASerializableEnumeration } [DataMember] internal Position说明;
    【解决方案4】:

    试试这个。

    [Serializable]
    public enum EnumToSerialize
    {
        [XmlEnum("1")]
        One = 1,
        [XmlEnum("2")]
        Two = 2
    }
    

    【讨论】:

    • 试过了,还是不行。当我序列化它/将消息放在 MSMQ 上时,它甚至不会序列化该属性
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 2019-05-31
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2014-08-10
    • 2011-12-07
    相关资源
    最近更新 更多