3

Я просмотрел несколько вопросов, но ни один из ответов не помог. Я попытался использовать несколько объектов потока (StreamWriter, FileStream). Я пробовал использовать XmlWriter, XmlSerializer и более.Сериализация объекта XML-файла вызывает исключение

Это мой код:

namespace FacebookPlusPlus 
{ 
    internal static class AppConfig 
    { 
     public static string AccessToken 
     { 
      get { return s_SerializableConfig.m_AccessToken; } 
      set { s_SerializableConfig.m_AccessToken = value; } 
     } 

     public static bool AutoConnect 
     { 
      get { return s_SerializableConfig.m_AutoConnect; } 
      set { s_SerializableConfig.m_AutoConnect = value; } 
     } 

     public static string ErrorMessage { get; set; } 

     private const string k_ConfigFilePath = "AppConfig.xml"; 
     private static SerializableConfig s_SerializableConfig = new SerializableConfig(); 

     [Serializable] 
     public class SerializableConfig 
     { 
      public string m_AccessToken; 
      public bool m_AutoConnect; 
     } 

     public static bool ExportConfig() 
     { 
      bool exportSucceed = false; 
      try 
      { 
       using (StreamWriter writer = new StreamWriter(File.Open(k_ConfigFilePath, FileMode.Create))) 
       { 
        XmlSerializer serializer = new XmlSerializer(s_SerializableConfig.GetType()); 
        serializer.Serialize(writer, s_SerializableConfig); 
       } 

       exportSucceed = true; 
      } 
      catch (Exception exception) 
      { 
       ErrorMessage = exception.Message; 
       if (File.Exists(k_ConfigFilePath)) 
       { 
        File.Delete(k_ConfigFilePath); 
       } 
      } 

      return exportSucceed; 
     } 

     public static bool ImportConfig() 
     { 
      bool importSucceed = false; 
      if (File.Exists(k_ConfigFilePath)) 
      { 
       try 
       { 
        using (Stream stream = File.Open(k_ConfigFilePath, FileMode.Open)) 
        { 
         XmlSerializer serializer = new XmlSerializer(s_SerializableConfig.GetType()); 
         s_SerializableConfig = (SerializableConfig)serializer.Deserialize(stream); 
        } 

        importSucceed = true; 
       } 
       catch (Exception exception) 
       { 
        importSucceed = false; 
        ErrorMessage = exception.Message; 
       } 
      } 

      return importSucceed; 
     } 
    } 
} 

Это исключение:

There was an error generating the XML document. 
    at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) 
    at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) 
    at FacebookPlusPlus.AppConfig.ExportConfig() in c:\\...\\AppLogic\\AppConfig.cs:line 48 

В момент возникновения ошибки поле AccessToken содержащемуся длинную строку и AutoConnect содержащемуся true

+1

Вы можете проверить наличие 'InnerException' ошибок, которые находятся в заброшенном исключения, а? С помощью 'XmlSerializer' эти внутренние исключения обычно содержат соответствующую информацию. –

+1

Это известная ошибка/«ограничение» для «XmlSerializer». См. [Как сериализовать нестатический дочерний класс статического класса] (http://stackoverflow.com/questions/4479817/how-to-serialize-non-static-child-class-of-static-class). Обходные пути - это развязать вложенный класс или использовать «DataContractSerializer» или сделать внешний класс нестатическим, но с закрытым конструктором, который генерирует исключение. – dbc

+0

@dbc, спасибо. см. мой ответ –

ответ

0

ОК, я сделал то, что @dbc предложил и сделал AppConfig общественности, вынимает статический атрибут и скрывала его c'tor. Прекрасно работает!

Все еще разочарование в связи с C# странными ограничениями, мне потребовалось пару часов, чтобы понять. И я ненавижу обходные

namespace FacebookPlusPlus 
{ 
    public class AppConfig 
    { 
     ... 

     [Serializable] 
     public class SerializableConfig 
     { 
      public string m_AccessToken; 
      public bool m_AutoConnect; 
     } 

     private AppConfig() 
     { 
      throw new InvalidOperationException("AppConfig Ctor Invoked"); 
     } 

     ... 
    } 
} 
0

Когда ты вызовите метод Serealize, первый параметр, который вы указываете, может быть основной причиной проблемы:

В параметре xmlWriter укажите объект, который выводится из абстрактного класса XmlWriter . XmlTextWriter происходит от XmlWriter.

В вашем случае вы используете StreamWriter, который не является XmlWriter.

Источник: https://msdn.microsoft.com/en-us/library/10y9yyta(v=VS.110).aspx

Edit: Так как вы уже пробовали выше, и это не помогло с вашей проблемой, как сказал Крис Синклер, попытайтесь получить внутреннее исключение. Следующий фрагмент кода может помочь:

public void SerializeContainer(XmlWriter writer, Container obj) 
{ 
    try 
    { 
    // Make sure even the construsctor runs inside a 
    // try-catch block 
    XmlSerializer ser = new XmlSerializer(typeof(Container)); 
    ser.Serialize(writer, obj); 
    } 
    catch(Exception ex)    
    {         
    DumpException(ex);    
    }         
} 
public static void DumpException(Exception ex) 
{ 
    Console.WriteLine("--------- Outer Exception Data ---------");   
    WriteExceptionInfo(ex); 
    ex = ex.InnerException;      
    if(null != ex)    
    {         
    Console.WriteLine("--------- Inner Exception Data ---------");     
    WriteExceptionInfo(ex.InnerException);  
    ex = ex.InnerException; 
    } 
} 
public static void WriteExceptionInfo(Exception ex) 
{ 
    Console.WriteLine("Message: {0}", ex.Message);     
    Console.WriteLine("Exception Type: {0}", ex.GetType().FullName); 
    Console.WriteLine("Source: {0}", ex.Source);      
    Console.WriteLine("StrackTrace: {0}", ex.StackTrace);   
    Console.WriteLine("TargetSite: {0}", ex.TargetSite);    
} 

Источник: https://msdn.microsoft.com/en-us/library/Aa302290.aspx

+1

Они указали, что попробовали 'XmlWriter', и это не сработало. Кроме того, 'StreamWriter' является допустимым вводом, поскольку он наследует от' TextWriter', который работает с [этой перегрузкой 'Serialize'.] (Https://msdn.microsoft.com/en-us/library/d15aekdk%28v=vs .110% 29.aspx) –

+0

К сожалению. Они упомянули об этом в самом начале. – gmalla

+0

Да, я попробовал это. Почему так сложно сериализовать объект на XML в любом случае? кажется, что .NET должен быть в правильном настроении, чтобы позволить вам конвертировать некоторые данные в строки. –

Смежные вопросы