做了一个监控平台。
保存实时数据用的是序列化(xml),大概是1秒种保存一次。XML本身并不大,几十 KB。
软件运行正常情况下或正常退出并不会有问题。但是,如果软件出现异常(由于系统),序列化出来的XML文件就会是0KB,下次运行的时候,加载实时数据就会没有。这是极端问题,但是的确出现过,大家有什么好的办法?

解决方案 »

  1.   

    try ... catch 再序列化一次。
      

  2.   


    这个异常并一定是序列化出现的问题。try无法确定。
      

  3.   

    当出现异常退出的时候,可能正在进行序列化,所以文件的字节数为0,我想你应该加固监控部分的程序,尽可能避免出现崩溃的情况。如果实在不行,并且输出的这个XML非常重要,建议用第二个进程(不是线程),专门进行数据的采集和序列化,减小因主程序崩溃而导致数据不完整的情况。
      

  4.   

    ProtoBuf序列化对象替代序列化Xml
    参考
    www.cnblogs.com/mail-ricklee
      

  5.   

    并不是序列化本身的问题。NULL,也不会出现。比如说系统内存问题导致了程序异常(其他程序也会)
      

  6.   

    如果不是序列化的问题,怎么出现个0KB的文件呢?至少异常之后,序列化代码仍被执行了吧。
    想不通的是,如果出现Fatal异常了,程序不应该继续执行而生成异常文件。
    而应该保护现场,提示错误,安全退出,减少异常的影响。
    当然如果能定位异常发生的症结所在并对症下药才是真正的解决办法。
      

  7.   

     string tempxml = Path.GetTempPath() + Guid.NewGuid().ToString() + ".xml";              [align=left]  XmlSerializer ser = new XmlSerializer(typeof(T));
                    //TextWriter writer = new StreamWriter(this.SaveSerializePath);
                    TextWriter writer = new StreamWriter(tempxml);
                    ser.Serialize(writer, t);
                    writer.Close();                //----------------2011-02-14-------------------//
                    //----------------防止XML文件格式不对----------//
                    if (System.IO.File.Exists(tempxml))
                    {
                        bool valid=this.ValidateXML(tempxml);
                        if (valid)
                        {
                            System.IO.File.Copy(tempxml, this.SaveSerializePath, true);
                        }                    System.IO.File.Delete(tempxml);
                    }
                    //---------------------------------------------//[/align]
    这样解决的。