2012-07-05 53 views
0

我有一些对象序列化输出。对象的某些属性很繁重,需要一些时间来完成。我在想的是如何指定用户想要获取的属性集,并仅序列化该集而不是全部这些集。灵活序列化的任何想法

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

另一个问题是现在指定应该序列化的一组属性。理想情况下,像XQuery这样的东西可以指定究竟应该序列化的东西。

因此,现在它的问题比答案更多......任何想法/想法//建议不止欢迎!

回答

1

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

在这个例子中,我只对Floors类型实现了System.Runtime.Serialization.ISerializable。而在“楼层”类型中,我控制“房间”列表的序列化和反序列化。

不知道更多关于你的类型的具体细节,特别是重要计算的属性,我不能专门与他们说话;不过,我认为通过使用实现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 
+0

嗨兰迪,谢谢你的回应!我知道提供GetObjectData的ISerializable接口和功能。但在我的情况下,我的对象用[DataContract]标记,在这种情况下我不能使用ISerializable接口。现在我正在查看IDataContractSurrogate接口以及它提供的内容。无论如何,再次感谢您的回应! – 2012-07-06 19:24:52