Transient Fields In .NET

This topic applies to .NET version only

There are different ways to prevent fields persistence in .NET:

For example, let's create a FieldTransient attribute and mark it to prevent object persistence:

FieldTransient.cs
01/* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com */ 02using System; 03 04namespace Db4objects.Db4odoc.SelectivePersistence 05{ 06 [AttributeUsage(AttributeTargets.Field)] 07 public class FieldTransient: Attribute 08 { 09 } 10}
MarkTransientExample.cs: ConfigureTransient
1private static IConfiguration ConfigureTransient() 2 { 3 IConfiguration configuration = Db4oFactory.NewConfiguration(); 4 configuration.MarkTransient("Db4objects.Db4odoc.SelectivePersistence.FieldTransient"); 5 return configuration; 6 }

FieldTransient.vb
1' Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com 2Namespace Db4objects.Db4odoc.SelectivePersistence 3 <AttributeUsage(AttributeTargets.Field)> _ 4 Public Class FieldTransient 5 Inherits Attribute 6 End Class 7End Namespace
MarkTransientExample.vb: ConfigureTransient
1Public Shared Function ConfigureTransient() As IConfiguration 2 Dim configuration As IConfiguration = Db4oFactory.NewConfiguration() 3 configuration.MarkTransient("Db4objects.Db4odoc.SelectivePersistence.FieldTransient") 4 Return configuration 5 End Function

Let's use the newly-defined FieldTransient attribute and the system-provided Transient, and compare the results:
Test.cs
01/* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com */ 02using System; 03namespace Db4objects.Db4odoc.SelectivePersistence 04{ 05 public class Test 06 { 07 [Db4objects.Db4o.Transient] 08 // you can also use [NonSerializedAttribute] 09 string _transientField; 10 string _persistentField; 11 12 public Test(string transientField, string persistentField) 13 { 14 _transientField = transientField; 15 _persistentField = persistentField; 16 } 17 18 public override string ToString() 19 { 20 return "Test: persistent: " + _persistentField + ", transient: " + _transientField ; 21 } 22 } 23}
Test.vb
01' Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com 02Imports System 03Imports Db4objects.Db4o 04 05Namespace Db4objects.Db4odoc.SelectivePersistence 06 Public Class Test 07 <Transient()> Dim _transientField As String 08 ' You can also use <NonSerialized()> Dim _transientField As String 09 ' and mark the class <Serializable()> 10 Dim _persistentField As String 11 12 Public Sub New(ByVal transientField As String, ByVal persistentField As String) 13 _transientField = transientField 14 _persistentField = persistentField 15 End Sub 16 17 Public Overrides Function ToString() As String 18 Return "Test: persistent: " + _persistentField + ", transient: " + _transientField 19 End Function 20 End Class 21End Namespace
TestCustomized.cs
01/* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com */ 02namespace Db4objects.Db4odoc.SelectivePersistence 03{ 04 public class TestCustomized 05 { 06 [Db4objects.Db4odoc.SelectivePersistence.FieldTransient] 07 string _transientField; 08 string _persistentField; 09 10 public TestCustomized(string transientField, string persistentField) 11 { 12 _transientField = transientField; 13 _persistentField = persistentField; 14 } 15 16 public override string ToString() 17 { 18 return "Customized test: persistent: " + _persistentField + ", transient: " + _transientField ; 19 } 20 } 21}
TestCustomized.vb
01' Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com 02 03Namespace Db4objects.Db4odoc.SelectivePersistence 04 Public Class TestCusomized 05 <Db4objects.Db4odoc.SelectivePersistence.FieldTransient()> Dim _transientField As String 06 Dim _persistentField As String 07 08 Public Sub New(ByVal transientField As String, ByVal persistentField As String) 09 _transientField = transientField 10 _persistentField = persistentField 11 End Sub 12 13 Public Overrides Function ToString() As String 14 Return "Customized test: persistent: " + _persistentField + ", transient: " + _transientField 15 End Function 16 End Class 17End Namespace

We will save and retrieve both Test and TestCustomized objects, having transient fields defined in different manner:

MarkTransientExample.cs: SaveObjects
01private static void SaveObjects(IConfiguration configuration) 02 { 03 File.Delete(Db4oFileName); 04 IObjectContainer container = Db4oFactory.OpenFile(configuration, Db4oFileName); 05 try 06 { 07 Test test = new Test("Transient string","Persistent string"); 08 container.Set(test); 09 TestCustomized testc = new TestCustomized("Transient string","Persistent string"); 10 container.Set(testc); 11 } 12 finally 13 { 14 container.Close(); 15 } 16 }
MarkTransientExample.cs: RetrieveObjects
01private static void RetrieveObjects() 02 { 03 IObjectContainer container = Db4oFactory.OpenFile(Db4oFileName); 04 try 05 { 06 IQuery query = container.Query(); 07 query.Constrain(typeof(object)); 08 IList result = query.Execute(); 09 ListResult(result); 10 } 11 finally 12 { 13 container.Close(); 14 } 15 }

MarkTransientExample.vb: SaveObjects
01Public Shared Sub SaveObjects(ByVal configuration As IConfiguration) 02 File.Delete(Db4oFileName) 03 Dim container As IObjectContainer = Db4oFactory.OpenFile(configuration, Db4oFileName) 04 Try 05 Dim test As Test = New Test("Transient string", "Persistent string") 06 container.Set(test) 07 Dim testc As TestCusomized = New TestCusomized("Transient string", "Persistent string") 08 container.Set(testc) 09 Finally 10 container.Close() 11 End Try 12 End Sub
MarkTransientExample.vb: RetrieveObjects
01Public Shared Sub RetrieveObjects() 02 Dim container As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName) 03 Try 04 Dim query As IQuery = container.Query() 05 query.Constrain(GetType(Object)) 06 Dim result As IList = query.Execute() 07 ListResult(result) 08 Finally 09 container.Close() 10 End Try 11 End Sub

You will see the identical results independently of the way the transiency is defined.