我正在尝试通过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”的原因?但是如何序列化枚举?
答案 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,您仍然需要强制转换它。