簡體   English   中英

XML序列化和空文件

[英]Xml serialization and empty file

我踩到了一個非常怪異的錯誤,很難重現,而實際上卻無法重現。 我們在大約300多台PC上安裝了窗口服務。 該服務使用的配置文件(xml)有時會變得很清晰(其中一些)。 完全清除沒有xml標記,什么也沒有,0kb。 我不知道什么會導致這種問題。 我們的日志中沒有記錄異常。 即使此配置變得清晰之后,它仍在運行,但是仍未與我們的Web服務通信。 這是用於xml序列化和反序列化的類。 我找不到可能導致這種行為的原因。 當然,問題可能不在此特定類中。 有什么建議么?? 也許有些提示可以導致文件變得清晰。 通過使用該類對該文件進行任何操作時。

對不起,我的英語不好。

[XmlRootAttribute("xmlconfig", Namespace = "DSD_Config", IsNullable = false)]
public class xmlconfig
{
    [XmlElementAttribute(IsNullable = false)]
    public string ProgramApteczny { get; set; }
    public string Server { get; set; }
    public string Database { get; set; }
    public string User { get; set; }
    public string Password { get; set; }
    public string DSDUser { get; set; }
    public string DSDPassword { get; set; }
    public string DSDServerAdres { get; set; }

    //public static string cofFile = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\DSD_Agent\\config.xml";
    public static string cofFile = Application.StartupPath + "\\config.xml";

    public xmlconfig()
    {
    }

    public xmlconfig(string sProgramApteczny, string sServer, string sDatabase, string sUser, string sPassword, string sDSDUser, string sDSDPassword, string sDSDServerAdres)
    {
        ProgramApteczny = sProgramApteczny;
        Server = sServer;
        Database = sDatabase;
        User = sUser;
        Password = sPassword;
        DSDUser = sDSDUser;
        DSDPassword = sDSDPassword;
        DSDServerAdres = sDSDServerAdres;
    }

    public static void readXMLConfig(out xmlconfig configFile)
    {
        XmlSerializer oSerializer = new XmlSerializer(typeof(xmlconfig));
        configFile = new xmlconfig(); 

        try
        {
            using (FileStream fs = new FileStream(cofFile, FileMode.Open, FileAccess.Read))
            {
                 configFile = (xmlconfig)oSerializer.Deserialize(fs);

                 try
                 {
                     configFile.Password = Encryption.DecryptString(configFile.Password);
                 }
                 catch (Exception)
                 {
                     configFile.Password = configFile.Password;
                 }

                 try
                 {
                     configFile.DSDPassword = Encryption.DecryptString(configFile.DSDPassword);
                 }
                 catch (Exception)
                 {
                     configFile.DSDPassword = configFile.DSDPassword;
                 }
            }
        }
        catch 
        {
            configFile = null;
        }
    }

    public static void writeXMLConfig(string sProgramApteczny, string sServer, string sDatabase, string sUser, string sPassword, string sDSDUser, string sDSDPassword)
    {
        xmlconfig oxmlconfig = new xmlconfig();
        readXMLConfig(out oxmlconfig);

        sPassword = Encryption.EncryptString(sPassword);
        sDSDPassword = Encryption.EncryptString(sDSDPassword);

        if (oxmlconfig == null)
        {
            oxmlconfig = new xmlconfig(sProgramApteczny, sServer, sDatabase, sUser, sPassword, sDSDUser, sDSDPassword, "");
        }
        else
        {
            oxmlconfig.ProgramApteczny = sProgramApteczny;
            oxmlconfig.Server = sServer;
            oxmlconfig.Database = sDatabase;
            oxmlconfig.User = sUser;
            oxmlconfig.Password = sPassword;
            oxmlconfig.DSDUser = sDSDUser;
            oxmlconfig.DSDPassword = sDSDPassword;
        }

        XmlSerializer oSerializer = new XmlSerializer(typeof(xmlconfig));
        TextWriter oStreamWriter = null;
        try
        {
            oStreamWriter = new StreamWriter(cofFile, false);
            oSerializer.Serialize(oStreamWriter, oxmlconfig);
        }
        catch (Exception oException)
        {
            WriteToLog(DateTime.Now, "Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
            // Console.WriteLine("Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
        }
        finally
        {
            if (null != oStreamWriter)
            {
                oStreamWriter.Close();
            }
        }
    }

    public static void writeXMLDSDConfig(string sDSDServerAdres)
    {
        xmlconfig oxmlconfig = new xmlconfig();
        readXMLConfig(out oxmlconfig);

        if (oxmlconfig == null)
        {
            throw new Exception("Aplikacja wygenerowała następujący wyjątek: Musisz zdefiniować wszystkie parametry");
        }
        else
        {
            oxmlconfig.DSDPassword = Encryption.EncryptString(oxmlconfig.DSDPassword);
            oxmlconfig.Password = Encryption.EncryptString(oxmlconfig.Password);
            oxmlconfig.DSDServerAdres = sDSDServerAdres;
        }

        XmlSerializer oSerializer = new XmlSerializer(typeof(xmlconfig));
        TextWriter oStreamWriter = null;
        try
        {
            oStreamWriter = new StreamWriter(cofFile, false);
            oSerializer.Serialize(oStreamWriter, oxmlconfig);
        }
        catch (Exception oException)
        {
            throw new Exception("Aplikacja wygenerowała następujący wyjątek: " + oException.Message);
        }
        finally
        {
            if (null != oStreamWriter)
            {
                oStreamWriter.Close();
            }
        }
    }
}

我猜想,該xml文件可以由多台計算機/ Windows服務訪問; 如果是這樣的話?

讀寫文件時似乎沒有使用鎖定機制。 一種可能的解決方法是使用單個實例類,該實例類僅允許一個線程同時讀取/寫入文件。

bool isInProgress=false

Public void Read()    
{    
    if(isInProgress==false)    
    {    
        isInProgress=true;  

        try    
        {    
            //Do reading or writing
        }    
        finally
        {
            isInProgress=false;
        }
    }    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM