Vb.net 在自定义反序列化构造函数中添加字段

Vb.net 在自定义反序列化构造函数中添加字段,vb.net,serialization,Vb.net,Serialization,我有一个实现ISerializable接口的类,其中有一个保存和检索的私有字段: Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext) _name= info.GetString("_name") End Sub 现在,我想添加一个新的私有字段,但由于它以前不存在,当我尝试打开一个序列化对象时,在自定义反序列化构造函数中尝试获取该字段时,会出现异常。我提出的解决方案是使

我有一个实现ISerializable接口的类,其中有一个保存和检索的私有字段:

Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
    _name= info.GetString("_name")
End Sub
现在,我想添加一个新的私有字段,但由于它以前不存在,当我尝试打开一个序列化对象时,在自定义反序列化构造函数中尝试获取该字段时,会出现异常。我提出的解决方案是使用Try…Catch块,如下所示:

Protected Sub New(ByVal info As SerializationInfo, _
                 ByVal context As StreamingContext)
    _name= info.GetString("_name")
    Try
       _active= info.GetBoolean("_active")
    Catch ex As Exception
        _active= False
    End Try
End Sub
它是有效的,但对我来说似乎有点混乱,而且因为我必须为我想要添加的每个新字段添加一个新的Try…Catch块。 有没有更好的办法

谢谢

编辑
在t0mm13b中说“在2.0+以上版本中有一种更简洁的方法来实现这一点”。关于他在说什么有什么想法吗?

没有内置的方法允许您首先确定某个特定值是否存在(例如,
存在
)。如果值不存在(例如
TryGet
),也没有简单返回
Nothing
Get…
方法。但是,避免出现异常的一种方法是对每个循环使用
,以迭代
序列化信息
集合中的所有值。例如:

For Each i As SerializationEntry In info
    Select Case i.Name
        Case "_name"
            _name = DirectCast(i.Value, String)

        ' ...
    End Select
Next
注意:对于
序列化信息
对象上的每个
循环都可以使用
,这可能会让您感到惊讶,因为它没有实现
IEnumerable
接口(也没有通用的等效接口)。但是,VB.NET中的每个
的实际上可以与任何具有公共GetEnumerator方法的对象一起使用。因此,尽管这会导致一些混乱,但从技术上讲,对象并不需要实现
IEnumerable
,以便您对每个
循环使用
进行迭代。由于
SerializationInfo
类确实公开了一个公共方法,因此可以对每个
循环使用
进行迭代