XML序列化后,反序列化时出现错误,
"XML 文档(779, 13)中有错误。"
查看了一下序列化的文件,在文件最后总是会多出一些垃圾字符导致反序列化错误,请问大侠这是怎么回事?序列化
                using (FileStream fs = new FileStream(strFile, FileMode.OpenOrCreate))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(ClassData));
                    formatter.Serialize(fs, MyVarValue);
                    fs.Close();
                }  
反序列化
                using (FileStream fs = new FileStream(m_strDes, FileMode.Open))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(ClassData));
                    MyVarValue = (ClassData)formatter.Deserialize(fs);
                    fs.Close();
                }

解决方案 »

  1.   

    例如我对这个</ClassData>类序列化后
    在xml文件的最后</ClassData>出还有出现这个类的一下字母
    例如
    </ClassData>>
    </ClassData>ata>
    导致反序列化时出现这个位置有错误,我的程序哪里错了?
      

  2.   

    把ClassData类的定义以及ClassData序列化之前包含的数据贴上分析一下.
      

  3.   

    看看有没有null的值,我以前也碰见过类似的问题,在序列化之前,把对象中所有的null的属性都 new 了一下就好了。
      

  4.   

    或者是用 DataContract和DataMember试试吧,比默认的功能更多一些,就是用起来有点儿麻烦
      

  5.   

    [Serializable]
        public class ClassData
        {
            //分析界面变量
            public bool bIsMousePot = true;                             //鼠标点击
            public bool bIsZoom = false;                                //放大
            public bool bIsAdjust = false;                              //是否被选中        public const int nMkrNum = 6;                              //er点的个数
            public const int nLimNum = 2;                              //开始合格线的点数 
            public int nDivNum = 10;                                    //纵轴显示的格数
            public double dTopLev = 0;                                  //最top的线
            public double dBottomLev = 100;                             //最Bottom的线        public double dStartFreq = 25;                              //开始的频率点值
            public double dStopFreq = 75;                               //终止的频率点值
            public string strStartFreqUnit = "MHz";                     //开始频率点的单位
            public string strStopFreqUnit = "MHz";                      //终止频率点的单位
            public List<ClassMarker> lstMkrInfo = new List<ClassMarker>();
            public List<ClassMarker> lstMkrCompInfo = new List<ClassMarker>();        public List<ClassLimiteLine> lstMaxLim = new List<ClassLimiteLine>();
            public List<ClassLimiteLine> lstMinLim = new List<ClassLimiteLine>();        //删除
            public double[] nRdNum = new double[517];        public ClassData()
            {
            }
        }大概就是这样,除了一些常用变量也就是几个List<>了,但有时转换就没有问题,有时就会出现多处字符在反序列化时出错。
      

  6.   

     #region 序列化
            /// <summary>
            /// 序列化
            /// </summary>
            /// <param name="o"></param>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static void SerializeObject(object o, string fileName)
            {
                string file = Directory.GetCurrentDirectory() + "\\" + fileName;
                try
                {
                    //删除临时文件
                    if (File.Exists(file))
                        File.Delete(file);
                    //序列化到文件
                    IFormatter formatter = new BinaryFormatter();
                    Stream stream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None);
                    formatter.Serialize(stream, o);
                    stream.Close();
                    stream = null;            }
                catch (Exception ex)
                {
                    Log.WriteTextLog("admin", LogType.ErrorLog, "序列化数据", ex.Message);
                }
            }
            #endregion
            #region 反序列化
            /// <summary>
            /// 反序列化
            /// </summary>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public static object DeserializeObject(string fileName)
            {
                object result = null;
                string file = Directory.GetCurrentDirectory() + "\\" + fileName;
                try
                {
                    //反序列化
                    Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None);
                    IFormatter formatter = new BinaryFormatter();
                    result = formatter.Deserialize(stream);
                    stream.Close();
                    stream = null;
                }
                catch (Exception ex)
                {
                    Log.WriteTextLog("admin", LogType.ErrorLog, "反序列化数据", ex.Message);
                }
                return result;
            }
            #endregion
      

  7.   

    看你7楼的代码,序列化时,没有做什么事情啊。  字段又没有标记为可序列化。怎么会不出错。 简单类型的字段前加上  [Serializable]
    没有实现 iSerial接口的要在序列化时自己写。dotnet中有很多例子。找一个就可以解决你的问题
      

  8.   

     using (FileStream fs = new FileStream(m_strDes, FileMode.Open))
      {
      XmlSerializer formatter = new XmlSerializer(typeof(ClassData));
      fs.Seek(0, SeekOrigin.Begin);
      MyVarValue = (ClassData)formatter.Deserialize(fs);
      fs.Close();
      }
      

  9.   


    字段标示为可序列化了,什么类型是没有实现iSerial接口?List<>么?xml序列化可以序列它的,soap不可以。没有看明白你的意思,能说详细点么?
      

  10.   


    文件格式怎么不对?用xml序列化是必须要保存为.xml文件么?