基準測試,序列化對象binaryfile,XML文件和XML字符串:
- 收件500.000對象binaryfile(1954ms/23MB)
- 收件500.000對象的XML文件(660ms/46MB)
- 收件500.000對象XML字符串(847ms,處理38MB-> 348MB)
驚訝地發現它需要更長的時間來寫一個二進制文件比XML文件。我希望.Net只是轉儲內存而不進行任何處理和轉換。也許有比使用的更好的二進制串行器?
儘管預計會更小。 XML文件「僅」具有100%的開銷。
看到寫入XML文件比寫入內存中的字符串還要快。
我相信我的代碼可以被優化,這是很奇怪的,隨時要進行序列化:-)貢獻
對象:
<Serializable> _
Public Class oNames
Public Shared cNames As New List(Of oName)
<Serializable> _
Public Class oName
Public Property Firstname As String
Public Property Lastname As String
Sub New()
End Sub
End Class
Sub New()
End Sub
End Class
填充列表與500.000對象:
oNames.cNames.Clear()
For i As Integer = 1 To 500000
oNames.cNames.Add(New oNames.oName With {.Firstname = "MyFirstName" & i.ToString, .Lastname = "MyLastName" & i.ToString})
Next
寫入二進制文件(使用我自己的串行器類):
WCC.BinSerialization.ToFile(oNames.cNames, "c:\temp\ObjToBin.bin", IO.FileMode.Append)
寫入XML文件(用我自己的序列化器類):
WCC.XMLSerialization.Obj_To_XMLFile(oNames.cNames, "c:\temp\ObjToXML.xml")
寫入XML字符串(用我自己的序列化器類):
Dim XMLStr As String
XMLStr = WCC.XMLSerialization.Obj_To_XLMStr(oNames.cNames)
我的串行器類:
Public Class WCC
Public Class XMLSerialization
Public Shared Function Obj_To_XLMStr(Obj As Object) As String
Using SW As New System.IO.StringWriter
Dim X As New System.Xml.Serialization.XmlSerializer(Obj.GetType)
X.Serialize(SW, Obj)
Return SW.ToString
End Using
End Function
Public Shared Sub XMLStr_To_Obj(XMLString As String, ByRef ListObj As Object)
Using SR As New System.IO.StringReader(XMLString)
Dim X As New System.Xml.Serialization.XmlSerializer(ListObj.GetType)
ListObj = X.Deserialize(SR)
End Using
End Sub
Public Shared Sub Obj_To_XMLFile(Obj As Object, Path As String)
Dim XWS As New System.Xml.XmlWriterSettings
XWS.Indent = True
XWS.IndentChars = vbTab
Using XW As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(Path, XWS)
Dim X As New System.Xml.Serialization.XmlSerializer(Obj.GetType)
X.Serialize(XW, Obj)
End Using
End Sub
End Class
Public Class BinSerialization
Public Shared Sub ToFile(Obj As Object, Path As String, FileMode As IO.FileMode)
Using fs As New System.IO.FileStream(Path, FileMode)
Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
bf.Serialize(fs, Obj)
End Using
End Sub
End Class
End Class
你可能會更好地序列化你的集合類。如[存儲對象集合](http://stackoverflow.com/q/25879442/1070452)。就我個人而言,我會讓'SQLServerList'成爲*實現的集合類* a:列表 –
Plutonix
好吧,這就是我現在所擁有的:公共類SqlServerList繼承集合(SqlServer)實現IList(Of SqlServer)..我是很確定這就是你在 – cjw
得到的,如果你繼承'Collection(Of T)',你不需要列表。我實現List(T)的意思是一個簡單的'Private myList(Of SQLServer)'。你的類會公開Add等方法來管理列表。該類可以有一個Save方法來完成序列化(2-3行代碼)和一個Shared方法來加載它們。儘管收集將完全工作。 –
Plutonix