This DynamicTable object is a dynamic and expandable data class to store a table. You will find an introduction to this data class in a previous article. In the newest version of the DynamicTable I have implemented XML serialization functions to import and export a DynamicTable from or to an XML file. You will find the release on github and you are welcome to use the DynamicTable in your own projects.
https://github.com/oliverfunke/DynamicObjects/tree/2013-04-13_v1.1.0
DynamicTable to XML
The following source code shows a unit test function. Within this unit test a DynamicTable will be written to a XML file and a new DynamicTable will be created by reading the file.
IDynamicTable table = new DynamicTable(DynamicTableType.Expandable); dynamic row; string xmlExport; string fileName = _assemblyDirectory + @"\CsvTest.xml"; //add values row = new ExpandoObject(); row.FirstName = "Hans"; row.LastName = "Mueller"; row.Age = 30; row.TimeStamp = new DateTime(2012, 12, 24, 1, 2, 3); table.AddRow(row); row = new ExpandoObject(); row.LastName = "Meier"; row.Street = "Main street"; table.AddRow(row); //compare Assert.AreEqual(2, table.Rows.Count); Assert.AreEqual(5, table.Columns.Count); //export xmlExport = table.AsXml(); using (StreamWriter writer = new StreamWriter(fileName)) { writer.Write(xmlExport); } //remove rows table.RemoveAllRows(); Assert.AreEqual(0, table.Rows.Count); Assert.AreEqual(5, table.Columns.Count); //import using (StreamReader reader = new StreamReader(fileName)) { table.FromXml(ReadFile(reader)); } //compare row = table.Rows[0]; Assert.AreEqual("Hans", row.FirstName); Assert.AreEqual("Mueller", row.LastName); Assert.AreEqual(30, row.Age); Assert.AreEqual(2012, row.TimeStamp.Year); Assert.AreEqual(12, row.TimeStamp.Month); Assert.AreEqual(24, row.TimeStamp.Day); Assert.AreEqual(1, row.TimeStamp.Hour); Assert.AreEqual(2, row.TimeStamp.Minute); Assert.AreEqual(3, row.TimeStamp.Second); Assert.AreEqual("", row.Street); row = table.Rows[1]; Assert.AreEqual("", row.FirstName); Assert.AreEqual("Meier", row.LastName); Assert.AreEqual(0, row.Age); Assert.AreEqual(0, row.TimeStamp.Ticks); Assert.AreEqual("Main street", row.Street);
To read a file the following function is used.
private static IEnumerable<string> ReadFile(StreamReader reader) { while (reader.EndOfStream == false) { yield return reader.ReadLine(); } }
Summary
The DynamicTable object offers a flexible way to manage data within a table. By using the XML serialization functions it is possible to store the content of the DynamicTable into a file.
Here’s a real story. We worked on a precjot that was pretty well tested. Still, one day we discovered that one of the getter methods fails with a null-pointer-exception if its instance was created via the default (no-arg) constructor. It is a something that our tests didn’t cover.One of our team members decided to overcome this lack of testing (as he called it) by writing a test that goes over all classes in our precjot, instantiates each one and invokes every getter method. This, of course, made sure that the problem will not repeat it self. This approach is not as good as it sounds. Although it raised the coverage of most getter methods to 100% it did not check the return values. We were no longer able to use coverage to detect the methods that had no real test. Eventually, we removed this artificial test from the suite.