public void UnflattenObject()
    {
        var customer    = new Customer();
        var flattener   = new Tedd.DictionarySerializer();
        var dic         = flattener.ToFlatDictionary(customer, FlattenMemberType.Property);
        var unflattener = new Tedd.DictionaryDeserializer();
        var customer2   = unflattener.UnflattenDictionary <Customer>(dic);

        Assert.Equal(customer.Id, customer2.Id);
        Assert.Equal(customer.CreatedTs.TSValue, customer2.CreatedTs.TSValue);
        Assert.Equal(customer.ContactPerson.Name, customer2.ContactPerson.Name);
        Assert.Equal(customer.ContactPerson.Address, customer2.ContactPerson.Address);
    }
    public void FlattenObject()
    {
        var customer  = new Customer();
        var flattener = new Tedd.DictionarySerializer();
        var dic       = flattener.ToFlatDictionary(customer, FlattenMemberType.Property);

        // DoNotFlatten
        Assert.True(dic.ContainsKey(nameof(customer.CreatedTs)));
        // Plain property
        Assert.True(dic.ContainsKey(nameof(customer.Id)));
        // Person object goes deeper
        Assert.False(dic.ContainsKey(nameof(customer.ContactPerson)));
        Assert.True(dic.ContainsKey(nameof(customer.ContactPerson) + "." + nameof(customer.ContactPerson.Name)));
        Assert.True(dic.ContainsKey(nameof(customer.ContactPerson) + "." + nameof(customer.ContactPerson.Address)));
        Assert.True(dic.ContainsKey(nameof(customer.ContactPerson) + "." + nameof(customer.ContactPerson.Created)));
    }