namespace System.Workflow.ComponentModel.Serialization
{
    using System;
    using System.Xml;
    using System.Runtime.Serialization;
    using System.Reflection;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;

    #region XmlDocumentSurrogate
    internal sealed class XmlDocumentSurrogate : ISerializationSurrogate
    {
        internal XmlDocumentSurrogate() { }
        void ISerializationSurrogate.GetObjectData(object obj, SerializationInfo info, StreamingContext context)
        {
            XmlDocument doc = obj as XmlDocument;
            if (doc == null)
                throw new ArgumentException(SR.GetString(SR.Error_InvalidArgumentValue), "obj");

            info.AddValue("innerXml", doc.InnerXml);
            info.SetType(typeof(XmlDocumentReference));
        }
        object ISerializationSurrogate.SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
        {
            return null;
        }

        #region XmlDocumentReference
        [Serializable]
        private sealed class XmlDocumentReference : IObjectReference
        {
            private string innerXml = string.Empty;

            Object IObjectReference.GetRealObject(StreamingContext context)
            {
                XmlDocument doc = new XmlDocument();

                if (!string.IsNullOrEmpty(this.innerXml))
                    doc.InnerXml = this.innerXml;

                return doc;
            }
        }
        #endregion
    }
    #endregion
}