二进制序列化基于枚举的属性

时间:2015-09-20 12:50:32

标签: vb.net serialization enums

我正在尝试通过ISerializable接口克隆一个类。

不幸的是,基于枚举的属性导致了问题:

Public Enum EngineTypeList
    BipropellantEngine
    MonopropellantEngine
    SolidpropellantEngine
End Enum


Private _EngineType As EngineTypeList
Public Property EngineType() As EngineTypeList
    Get
        Return _EngineType
    End Get
    Set(ByVal value As EngineTypeList)
        _EngineType = value
    End Set
End Property

我的序列化/反序列化方法工作正常,因为我的所有其他属性都没有问题克隆,除了上面的反序列化后总是默认为“0”。

我认为我的构造函数或(可能是我的GetObjectDataInfo)会导致错误:

Public Sub New(ByVal Info As SerializationInfo, ByVal Context As StreamingContext)
    With Info
        EngineType = DirectCast(.GetValue("EngineType", GetType(EngineTypeList)), EngineTypeList)
    End With
End Sub

Private Sub GetObjectDataInfo(ByVal Info As SerializationInfo, ByVal Context As StreamingContext) Implements ISerializable.GetObjectData
    With Info
        .AddValue("EngineType", EngineType)
    End With
End Sub

演员可能完全是胡说八道(这是我第一次使用这个......)

一个想法:我没有序列化enum本身,所以它可能在克隆中丢失了。也许这就是为什么enginetype默认为“0”的原因?但是如何序列化枚举?

1 个答案:

答案 0 :(得分:1)

我认为这是错误的做法:

EngineType = DirectCast(.GetValue("EngineType", GetType(EngineTypeList)), EngineTypeList)

大多数枚举基本上都是Int32。如果您曾在反射中使用过一个,他们首先报告RuntimeType,您必须查看BaseType才能看到它是一个枚举。我不认为GetValue准备这样做。如果我尝试这样做,我会得到一个例外。

还有其他两种方法可以取回它。第一个是将其视为Int32

'GetObjectData
info.AddValue("EngineType", EngineType)

'deserializing constructor
EngineType = CType(info.GetInt32("EngineType"), EngineTypes)

将其取为Int32并投射。它也可以作为字符串使用:

'GetObjectData
info.AddValue("EngineTypeName", EngineType.ToString)

'deserializing constructor
EngineType = CType([Enum].Parse(GetType(EngineTypes),
          info.GetString("EngineTypeName")), EngineTypes)

序列化时存储Enum名称,然后将其作为字符串返回并将其解析为Type。由于Enum.Parse返回Object,您仍然需要强制转换它。