【问题标题】:Adding field in custom deserialization constructor在自定义反序列化构造函数中添加字段
【发布时间】:2014-02-28 17:14:43
【问题描述】:

我有一个实现 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 块。 有没有更好的方法呢?

谢谢!

编辑: 在this answer t0mm13b 中说“在 2.0+ 版本中有更简洁的方法可以做到这一点”。关于他在说什么有什么想法吗?

【问题讨论】:

    标签: vb.net serialization


    【解决方案1】:

    没有允许您首先确定特定值是否存在的内置方法(例如Exists)。也没有Get... 方法,如果值不存在(例如TryGet),它只会返回Nothing。但是,避免异常可能性的一种方法是使用For Each 循环遍历SerializationInfo 集合中的所有值。例如:

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

    注意:您可能会感到惊讶,您可以在SerializationInfo 对象上使用For Each 循环,因为它没有实现IEnumerable 接口(也没有通用的等效接口) .但是,VB.NET 中的For Each 实际上适用于任何具有公共GetEnumerator 方法的对象。因此,即使它会导致一些混乱,对象在技术上并不需要实现 IEnumerable 以便您使用 For Each 循环遍历它们。由于SerializationInfo确实公开了一个公共GetEnumerator 方法,因此您可以使用For Each 循环遍历它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2022-06-11
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多