anchor.diff:                      { Properties = ps; Attributes = [] }
               Atom.updateAtomDict propertyCache t info
   
  +    and writeClass (info: TypeWriterInfo) (name : NameInfo) (writer : TextWriter) (value : obj) =
  +        writeTag name.Name name writer (writeClassInner info) value
  +
  +    and writeClassWithAttributes (info : TypeWriterInfo) (name : NameInfo) (writer : TextWriter) (value : obj) =
  +        let attr =
  +            info.Attributes
  +            |> List.choose (fun a ->
  +                let v = a.GetFunc.Invoke value
  +                if v <> null then Some (a.Key, v.ToString()) else None)
  +        writeTagAttributes name.Name attr name writer (writeClassInner info) value
  +
       /// Writer for classes and other reference types
  -    and writeClass (info: TypeWriterInfo) _ (writer : TextWriter) (value : obj) =
  +    and writeClassInner (info: TypeWriterInfo) _ (writer : TextWriter) (value : obj) =
           info.Properties
           |> List.iter (fun p ->
               let v = p.GetFunc.Invoke(value)
               if v <> null then
                   let writeFunc = p.WriteFunc.Value
  -                writeTag p.Name.Name p.Name writer writeFunc v
  +                writeFunc p.Name writer v
               elif XmlConfig.Instance.IncludeNullValues then
                   writeEmptyTag p.Name.Name writer)
   
  
positive.code:             | TypeCode.UInt64 -> Some writeUInt64
              | _ -> None
  
  /// Serialization logic for list and collection types
  module internal ListSerializer =
  
  
negative.code:             if t.IsAbstract && not t.IsInterface then
                  Some writeAbstractProperties
              else
                  let writerInfo = getTypeWriterInfo t
                  Some (writeClass writerInfo)
          else None
  
      /// Try to determine a writer function for a dictionary
      and getDictionaryWriter (t : Type) = fun () ->
          if matchInterface typeof<IDictionary> t then
              Some <| injectWriteTag writeDictionary
          else None
  
      /// Try to determine a writer function for array types
      and getArrayWriter (t : Type) = fun () ->
          if t.IsArray then
              if t = typeof<byte[]> then Some <| injectWriteTag ValueTypeSerializer.writeBytes
              elif t = typeof<char[]> then Some <| injectWriteTag ValueTypeSerializer.writeChars
              elif t = typeof<int[]> then Some <| injectWriteTag ListSerializer.writeIntArray
              elif t = typeof<string[]> then Some <| injectWriteTag ListSerializer.writeStrArray
              // other array types will be handled by the IEnumerable writer
              else None
          else None
  