Добрый день, Михаил.
Пытаюсь воспользоваться вашей сериализацией. Возникло несколько вопросов:1) как объявить XML-атрибут. 2)как объявить корень сериализации( то есть название типа) 3) есть ли у Вас 
какая-нить документация по вашей сериализации. Пришлось отказаться от родного XmlSerializer ибо как я узнал он не умеет десериализовать типы типа internal. Вот пример моего кода:
Code
 [XmlRoot(ElementName = "result")]
    public class CommandResult
    {
        private static XmlSerializer _serializer;
        protected static XmlSerializer Serializer
        {
            get
            {
                if (_serializer == null)
                {
                    _serializer = new XmlSerializer(typeof(CommandResult));
                }
                return _serializer;
            }
        }
        [XmlAttribute("success")]
        public bool Success
        {
            get;
            set;
        }
        [XmlAttribute("transactionid")]
        public String TransactionId
        {
            get;
            set;
        }
        [XmlElement("message")]
        public String Message
        {
            get;
            set;
        }
        [XmlIgnore]
        public int? Difference
        {
            get;
            set;
        }
        [XmlAttribute("diff")]
        public String DifferenceAsString
        {
            get
            {
                if (Difference == null) return null;
                else
                    return ((int)Difference).ToString();
            }
            set
            {
                if (value == null) Difference = null;
                else
                    Difference = int.Parse(value);
            }
        }
        public static CommandResult FromXmlString(String s)
        {
            s = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + s;
            XmlSerializer serializer = Serializer;
            MemoryStream str = new MemoryStream(Encoding.UTF8.GetBytes(s));
            CommandResult result = (CommandResult)serializer.Deserialize(str);
            str.Close();
            return result;
        }
    }