0

出力にシリアル化されたオブジェクトがいくつかあります。オブジェクトの一部のプロパティは計算が重く、計算に時間がかかります。私が考えているのは、ユーザーが取得したいプロパティのセットを指定し、それらすべてではなくそのセットのみをシリアル化する方法です。

私はすでにいくつかの調査を行っており、[Serializable] 属性でマークされたオブジェクトの必要なプロパティのみをシリアル化する方法はかなり明確ですが、私の場合は [DataContract] でマークされたオブジェクトであり、まだいくつか質問があります。

もう 1 つの問題は、シリアル化する必要がある一連のプロパティを指定することです。理想的には、何をシリアライズする必要があるかを正確に指定するために、XQuery のようなものがあるとよいでしょう。

ですから、今のところは答えよりも質問の方が多いです...どんなアイデア/考え//提案も大歓迎です!

4

1 に答える 1

1

次の例では、3 つのフロアと各フロアに 4 つの部屋がある単純な建物を作成します。これは過度に複雑なオブジェクト グラフではありませんが、アイデアが伝わるはずです。System.Runtime.Serialization.ISerializableを実装してシリアル化プロセスを制御できるという考え方です。

この例では、Floors 型のSystem.Runtime.Serialization.ISerializableのみを実装しました。Floors タイプでは、Rooms リストのシリアライズとデシリアライズの方法を制御します。

あなたのタイプの特定の詳細、特に計算が重いプロパティについて詳しく知らなければ、具体的に話すことはできません。ただし、System.Runtime.Serialization.ISerializableを実装してシリアル化プロセスを制御することによって提供される手法を使用することで、探している結果を達成できると思います。

シリアル化ストリームには何でも追加でき、クラスにすべてを追加する必要はありません。ただし、逆シリアル化コンストラクターが実行された後は、少なくともクラスを「正しい」ものにする必要があります。シリアル化ストリームに何を入れるかはあなた次第です。

ただし、これはBinary Serializationでのみ機能し、Xml Serializationでは機能しないことに注意してください。

    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
于 2012-07-06T15:50:32.030 に答える