当前位置: 首页 > 知识库问答 >
问题:

灵活序列化的任何想法

公羊光明
2023-03-14

我有一些序列化为输出的对象。对象的某些属性需要大量计算,并且需要一些时间才能完成。我正在考虑的是如何指定用户想要获取的属性集,并仅序列化该集合而不是所有属性集。

我已经做了一些研究,很清楚如何仅序列化标记为[Serializable]属性的对象的所需属性,但在我的例子中,标记为[DataContract]的对象仍然存在一些问题。

现在的另一个问题是指定应该序列化的属性集。理想情况下,最好有像XQuery这样的东西来指定应该序列化的确切内容。

所以,就目前而言,问题多于答案...任何想法/想法//建议非常欢迎!

共有1个答案

洪胤
2023-03-14

下面的例子创建了一个简单的建筑,每层有3层和4个房间。这不是一个过于复杂的对象图,但我认为它应该传达这个想法。这个想法是你可以实现System.Runtime.Serialization.IS可序列化来控制序列化过程。

在这个例子中,我只实现了System.Runtime.Serialization。Floors类型的ISerializable。在Floors中,类型I控制Rooms列表的序列化和反序列化方式。

如果不了解您的类型的具体细节,特别是计算繁重的属性,我无法具体与他们交谈;但是,我认为通过使用实现System.Runtime.Serialization.ISerializable和控制序列化过程所提供的技术,您将能够实现所需的结果。

请记住,您可以向序列化流中添加任何内容,并且不需要在类中添加所有内容;然而,在反序列化构造函数运行后,您至少需要使类“正确”。您在序列化流中放入的内容取决于您。

但是请注意,这仅适用于二进制序列化,不适用于Xml序列化。

    Module Module1

    Sub Main()
        Dim floor1 As New Floor()
        floor1.Rooms.Add(New Rooms(101))
        floor1.Rooms.Add(New Rooms(102))
        floor1.Rooms.Add(New Rooms(103))
        floor1.Rooms.Add(New Rooms(104))

        Dim floor2 As New Floor()
        floor2.Rooms.Add(New Rooms(201))
        floor2.Rooms.Add(New Rooms(202))
        floor2.Rooms.Add(New Rooms(203))
        floor2.Rooms.Add(New Rooms(204))

        Dim floor3 As New Floor()
        floor3.Rooms.Add(New Rooms(301))
        floor3.Rooms.Add(New Rooms(302))
        floor3.Rooms.Add(New Rooms(303))
        floor3.Rooms.Add(New Rooms(304))

        Dim tower As New Building()
        tower.Floors.Add(floor1)
        tower.Floors.Add(floor2)
        tower.Floors.Add(floor3)

        Dim byteArray As Byte() = Serialized(tower)
        Dim backAgain As Building = DeSerialized(byteArray)
    End Sub

    Private Function Serialized(ByVal tower As Building) As Byte()
        Using ms As New System.IO.MemoryStream()
            Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            formatter.Serialize(ms, tower)
            Return ms.GetBuffer()
        End Using
    End Function

    Private Function DeSerialized(ByVal byteArray As Byte()) As Building
        Using ms As New System.IO.MemoryStream(byteArray)
            Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            ms.Position = 0
            Return DirectCast(formatter.Deserialize(ms), Building)
        End Using
    End Function
End Module

<Serializable()>
Public Class Building
    Public Sub New()
    End Sub

    Private _Floors As New List(Of Floor)
    Public ReadOnly Property Floors As List(Of Floor)
        Get
            Return _Floors
        End Get
    End Property
End Class

<Serializable()>
Public Class Floor
    Implements System.Runtime.Serialization.ISerializable

    Public Sub New()
    End Sub

    Public Sub New(ByVal info As Runtime.Serialization.SerializationInfo, ByVal context As Runtime.Serialization.StreamingContext)
        Dim counter As Integer = info.GetInt32("RoomCount")
        For index As Integer = 0 To counter - 1
            _Rooms.Add(DirectCast(info.GetValue(String.Format("Room{0}", index.ToString()), GetType(Rooms)), Rooms))
        Next
    End Sub

    Private _Rooms As New List(Of Rooms)
    Public ReadOnly Property Rooms As List(Of Rooms)
        Get
            Return _Rooms
        End Get
    End Property

    Public Sub GetObjectData(info As System.Runtime.Serialization.SerializationInfo, context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData
        info.AddValue("RoomCount", _Rooms.Count)
        For index As Integer = 0 To _Rooms.Count - 1
            info.AddValue(String.Format("Room{0}", index.ToString()), _Rooms(index))
        Next
    End Sub
End Class

<Serializable()>
Public Class Rooms
    Public Sub New()
    End Sub

    Public Sub New(ByVal roomNum As Integer)
        Me.New()
        _RoomNumber = roomNum
    End Sub

    Private _RoomNumber As Integer = 0
    Public Readonly Property RoomNumber As Integer
        Get
            Return _RoomNumber
        End Get
    End Property
End Class
 类似资料:
  • 我有一个应用程序屏幕,顶部有一个标题,底部有几个按钮,中心的其余部分有一个输入表单。 我试图实现的目标是:我希望输入表单子项(即不同的输入字段)在垂直轴上展开,以填充可用空间。当键盘打开并占据40%的屏幕时,我希望输入字段之间的所有灵活空间都缩小,如果这不足以显示所有内容,我希望“中心”部分是可滚动的,这样用户就可以找到其余的输入字段,现在隐藏在“下面”。 我使用的是与子列

  • 问题内容: 我现在两次遇到问题,生产者线程会产生N个工作项,将它们提交给an ,然后需要等待,直到所有N个项都已处理完毕。 注意事项 N事先未知 。如果是这样,我将简单地创建一个然后具有生产者线程,直到完成所有工作。 使用a 是不合适的,因为尽管我的生产者线程需要阻塞(即,通过调用),但 无法表示所有工作都已完成 ,从而导致生产者线程停止等待。 我当前喜欢的解决方案是使用整数计数器,并在提交工作项

  • 问题在于Spark数据集和INT列表的序列化。Scala版本是2.10.4,Spark版本是1.6。 这和其他问题类似,但是我不能基于这些回答让它工作。我已经简化了代码,以便仅仅显示问题。 我有一门案例课: 我的主要方法是: 我得到以下错误: 如果我从FlightExt中删除列表,那么一切正常,这表明lambda函数序列化没有问题。 Scala本身似乎序列化了一系列Int的优点。也许Spark在序

  • flex-basis 我们使用flex-basis属性在分配空间之前定义flex-item的默认大小。 以下示例演示了flex-basis属性的用法。 在这里,我们创建了3个彩色盒子,并将它们的尺寸固定为150像素。 <!doctype html> <html lang = "en"> <style> .box{ font-size:15px;

  • 使用Bootstrap 5,我如何使列根据其内容具有灵活的宽度,但所有列仍然填充行的全部宽度? 如果我使用,那么列的宽度都是相同的。如果我使用,那么列就不会填充行的宽度。 如有任何建议,将不胜感激。谢谢你。

  • 我有一个这样的转变: Pageview是一种:Pageview。JAVA 我在Spark上注册了这样的课程: 异常线程"main"org.apache.spark.SparkExctive:任务不能在org.apache.spark.util.ClosureCleaner$. ensureSerializable(ClosureCleaner.scala:166)在org.apache.spark