public void Write(Writer writer, string name, object Object)
        {
            writer.StartList(name);

            foreach(FieldOrProperty field in FieldOrProperty.GetFieldsAndProperties(type)) {
                LispChildAttribute ChildAttrib = (LispChildAttribute)
                    field.GetCustomAttribute(typeof(LispChildAttribute));
                if(ChildAttrib != null) {
                    object Value = field.GetValue(Object);
                    if(Value != null) {
                        if(ChildAttrib.Translatable) {
                            if(!ChildAttrib.Optional || !Value.Equals(ChildAttrib.Default))
                                writer.WriteTranslatable(ChildAttrib.Name, Value.ToString());
                        } else {
                            Type childType = field.Type;

                            ILispSerializer serializer = LispSerializer.GetSerializer(childType);
                            if(serializer != null) {
                                serializer.Write(writer, ChildAttrib.Name, Value);
                            } else {
                                if(ChildAttrib.Optional && childType.IsEnum) {
                                    // If it is an enum we need to convert ChildAttrib.Default
                                    // to an enum as ChildAttrib.Default is an Int32 by some (unknown) reason.
                                    Enum Defval = (Enum)Enum.ToObject(childType, ChildAttrib.Default);
                                    if (!Value.Equals(Defval))
                                        writer.Write(ChildAttrib.Name, Value);
                                } else if(!ChildAttrib.Optional || !Value.Equals(ChildAttrib.Default)) {
                                    writer.Write(ChildAttrib.Name, Value);
                                }
                            }
                        }
                    } else {
                        Console.WriteLine("Warning: Field '" + field.Name + "' is null");
                    }
                }

                foreach(LispChildsAttribute childsAttrib in
                        field.GetCustomAttributes(typeof(LispChildsAttribute))) {
                    if(childsAttrib != null) {
                        object list = field.GetValue(Object);
                        if(! (list is IEnumerable))
                            throw new LispException("Field '" + field.Name + "' is not IEnumerable");

                        ILispSerializer serializer = LispSerializer.GetSerializer(childsAttrib.Type);
                        if(serializer == null)
                            serializer = LispSerializer.CreateRootSerializer(childsAttrib.Type);

                        IEnumerable enumerable = (IEnumerable) list;
                        foreach(object childObject in enumerable) {
                            if(childsAttrib.Type.IsAssignableFrom(childObject.GetType())) {
                                serializer.Write(writer, childsAttrib.Name, childObject);
                            }
                        }
                    }
                }
            }

            if(Object is ICustomLispSerializer) {
                ICustomLispSerializer custom = (ICustomLispSerializer) Object;
                custom.CustomLispWrite(writer);
            }

            writer.EndList(name);
        }
 public void Write(Writer Writer, string name, object Object)
 {
     WriteType(Writer, RootType, name, Object);
 }
        private static void WriteType(Writer writer, Type type, string name, object Object)
        {
            ILispSerializer serializer = GetSerializer(type);
            if(serializer == null)
                serializer = CreateRootSerializer(type);

            serializer.Write(writer, name, Object);
        }
        public void Write(TextWriter TextWriter, string Dest, object Object)
        {
            LispRootAttribute rootAttrib = (LispRootAttribute)
                Attribute.GetCustomAttribute(RootType, typeof(LispRootAttribute));
            if(rootAttrib == null)
                throw new LispException("Type needs to have LispRoot attribute");

            Writer Writer = new Writer(TextWriter);
            Write(Writer, rootAttrib.Name, Object);
        }