protected virtual DataSet LoadFromFile()
        {
            if (m_FileName == null)
            {
                throw new ApplicationException("FileName is null");
            }

            System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
            xmlDoc.Load(m_FileName);

            System.Xml.XmlNamespaceManager namespaceMan = new System.Xml.XmlNamespaceManager(xmlDoc.NameTable);
            namespaceMan.AddNamespace("fileds", c_DataNamespace);

            System.Xml.XmlNode tmp = xmlDoc.DocumentElement.SelectSingleNode("fileds:header", namespaceMan);
            if (tmp == null)
            {
                throw new ApplicationException("File header not found");
            }
            System.Xml.XmlElement header = (System.Xml.XmlElement)tmp;

            //File Version
            string strFileVersion = header.GetAttribute(c_FileVersion);
            int    fileVersion    = int.Parse(strFileVersion);

            if (fileVersion == c_FileVersionNumber)
            {
                string strDataFormat = header.GetAttribute(c_DataFormat);
                mFileDataFormat = (StreamDataSetFormat)int.Parse(strDataFormat);
            }
            else if (fileVersion == 0)
            {
                mFileDataFormat = StreamDataSetFormat.XML;
            }
            else if (fileVersion > c_FileVersionNumber)
            {
                throw new ApplicationException("File Version not supported, expected: " + c_FileVersionNumber.ToString());
            }

            //Data Version
            string  strDataVersion = header.GetAttribute(c_DataVersion);
            int     dataVersion    = int.Parse(strDataVersion);
            DataSet dataSet        = CreateData(dataVersion);

            //Data
            tmp = xmlDoc.DocumentElement.SelectSingleNode("fileds:data", namespaceMan);
            if (tmp == null)
            {
                throw new ApplicationException("File data not found");
            }
            System.Xml.XmlElement xmlDataNode = (System.Xml.XmlElement)tmp;

            byte[] xmlBuffer = System.Convert.FromBase64String(xmlDataNode.InnerText);
            using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(xmlBuffer))
            {
                StreamDataSet.Read(memStream, dataSet, mFileDataFormat, MergeReadedSchema);
                //dataSet.ReadXml(memStream);
            }

            return(dataSet);
        }
        protected virtual void SaveToFile(DataSet pDataSet)
        {
            if (m_FileName == null)
            {
                throw new ApplicationException("FileName is null");
            }

            byte[] completeByteArray;
            using (System.IO.MemoryStream fileMemStream = new System.IO.MemoryStream())
            {
                System.Xml.XmlTextWriter xmlWriter = new System.Xml.XmlTextWriter(fileMemStream, System.Text.Encoding.UTF8);

                xmlWriter.WriteStartDocument();
                xmlWriter.WriteStartElement("filedataset", c_DataNamespace);

                xmlWriter.WriteStartElement("header", c_DataNamespace);
                //File Version
                xmlWriter.WriteAttributeString(c_FileVersion, c_FileVersionNumber.ToString());
                //Data Version
                xmlWriter.WriteAttributeString(c_DataVersion, GetDataVersion().ToString());
                //Data Format
                xmlWriter.WriteAttributeString(c_DataFormat, ((int)mSaveDataFormat).ToString());
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("data", c_DataNamespace);

                byte[] xmlByteArray;
                using (System.IO.MemoryStream xmlMemStream = new System.IO.MemoryStream())
                {
                    StreamDataSet.Write(xmlMemStream, pDataSet, mSaveDataFormat);
                    //pDataSet.WriteXml(xmlMemStream);

                    xmlByteArray = xmlMemStream.ToArray();
                    xmlMemStream.Close();
                }

                xmlWriter.WriteBase64(xmlByteArray, 0, xmlByteArray.Length);
                xmlWriter.WriteEndElement();

                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndDocument();

                xmlWriter.Flush();

                completeByteArray = fileMemStream.ToArray();
                fileMemStream.Close();
            }

            //se tutto ?andato a buon fine scrivo effettivamente il file
            using (System.IO.FileStream fileStream = new System.IO.FileStream(m_FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write))
            {
                fileStream.Write(completeByteArray, 0, completeByteArray.Length);
                fileStream.Close();
            }
        }