Custom Marshaller Usage

Configure db4o to use the custom marshaller for the Item class:

CustomMarshallerExample.cs: configureMarshaller
1private static IConfiguration ConfigureMarshaller(){ 2 marshaller = new ItemMarshaller(); 3 IConfiguration configuration = Db4oFactory.NewConfiguration(); 4 configuration.ObjectClass(typeof(Item)).MarshallWith(marshaller); 5 return configuration; 6 }

CustomMarshallerExample.vb: configureMarshaller
1Private Shared Function ConfigureMarshaller() As IConfiguration 2 Dim configuration As IConfiguration = Db4oFactory.NewConfiguration() 3 marshaller = New ItemMarshaller 4 configuration.ObjectClass(GetType(Item)).MarshallWith(marshaller) 5 Return configuration 6 End Function

Now you can work with Item class objects just as usual:

CustomMarshallerExample.cs: storeObjects
01private static void StoreObjects(IConfiguration configuration) 02 { 03 File.Delete(Db4oFileName); 04 IObjectContainer container = Db4oFactory.OpenFile(configuration, Db4oFileName); 05 try { 06 Item item; 07 DateTime dt1 = DateTime.UtcNow; 08 for (int i = 0; i < 50000; i++){ 09 item = new Item(0xFFAF, 0xFFFFFFF, 120); 10 container.Set(item); 11 } 12 DateTime dt2 = DateTime.UtcNow; 13 TimeSpan diff = dt2 - dt1; 14 System.Console.WriteLine("Time to store the objects ="+ diff.Milliseconds + " ms"); 15 } finally { 16 container.Close(); 17 } 18 }

CustomMarshallerExample.cs: retrieveObjects
01private static void RetrieveObjects(IConfiguration configuration) 02 { 03 IObjectContainer container = Db4oFactory.OpenFile(configuration, Db4oFileName); 04 try { 05 IObjectSet result = container.Get(typeof(Item)); 06 DateTime dt1 = DateTime.UtcNow; 07 while (result.HasNext()) 08 { 09 Item item = (Item)result.Next(); 10 } 11 DateTime dt2 = DateTime.UtcNow; 12 TimeSpan diff = dt2 - dt1; 13 System.Console.WriteLine("Time to read the objects =" + diff.Milliseconds + " ms"); 14 } finally { 15 container.Close(); 16 } 17 }

CustomMarshallerExample.vb: storeObjects
01Private Shared Sub StoreObjects(ByVal configuration As IConfiguration) 02 File.Delete(Db4oFileName) 03 Dim container As IObjectContainer = Db4oFactory.OpenFile(configuration, Db4oFileName) 04 Try 05 Dim item As Item 06 Dim dt1 As DateTime = DateTime.UtcNow 07 Dim i As Integer = 0 08 While i < 500000 09 item = New Item(&HFFAF, &HFFFFFFA, 120) 10 container.Set(item) 11 System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) 12 End While 13 Dim dt2 As DateTime = DateTime.UtcNow 14 Dim diff As TimeSpan = dt2 - dt1 15 System.Console.WriteLine("Time to store the objects =" + diff.Milliseconds.ToString() + " ms") 16 Finally 17 container.Close() 18 End Try 19 End Sub

CustomMarshallerExample.vb: retrieveObjects
01Private Shared Sub RetrieveObjects(ByVal configuration As IConfiguration) 02 Dim container As IObjectContainer = Db4oFactory.OpenFile(configuration, Db4oFileName) 03 Try 04 Dim dt1 As DateTime = DateTime.UtcNow 05 Dim result As IObjectSet = container.Get(GetType(Item)) 06 Dim dt2 As DateTime = DateTime.UtcNow 07 Dim diff As TimeSpan = dt2 - dt1 08 System.Console.WriteLine("Time elapsed for the query =" + diff.Milliseconds.ToString() + " ms") 09 ListResult(result) 10 Finally 11 container.Close() 12 End Try 13 End Sub

Custom marshallers can help you to improve performance for selected classes if quering for fields is not required. The impact can be especially noticeable on bulk operations. It is recommended  to test the performance impact of a custom marshaller with your real application model.