What exactly do you want the result to look like? You can write it manually (see Lirik's answer), or if you need runtime support, maybe something like protobuf-net.
It would be trivial to do this if you were to use classes (which I expect you should really be), but additionally protobuf-net v2 (available only as a source at the moment) should work with it "as is".
For information, here is how I will do it as classes:
public class Company { private readonly List<Employee> employees = new List<Employee>(); public List<Employee> Employees { get { return employees;}} } public class Employee { public string EmployeeName {get;set;} public string Designation {get;set;} }
This may be decorated with serialization attributes or (again, using protobuf-net v2) something like this test (which passes):
[Test] public void CanSerializeCompany() { var model = TypeModel.Create(); model.Add(typeof(Company), false).Add("Employees"); model.Add(typeof(Employee), false).Add("EmployeeName", "Designation"); model.CompileInPlace(); Company comp = new Company { Employees = { new Employee { Designation = "Boss", EmployeeName = "Fred"}, new Employee { Designation = "Grunt", EmployeeName = "Jo"}, new Employee { Designation = "Scapegoat", EmployeeName = "Alex"}} }, clone; using(var ms = new MemoryStream()) { model.Serialize(ms, comp); ms.Position = 0; Console.WriteLine("Bytes: " + ms.Length); clone = (Company) model.Deserialize(ms, null, typeof(Company)); } Assert.AreEqual(3, clone.Employees.Count); Assert.AreEqual("Boss", clone.Employees[0].Designation); Assert.AreEqual("Alex", clone.Employees[2].EmployeeName); }
(and writes 46 bytes)
It should work with private fields, structures, etc. - I need to take a look ...
If you can add attributes, you do not need to configure the model manually (first 4 lines). The rest of the code just shows full round-trip usage.
Marc gravell
source share