Я просмотрел несколько вопросов, но ни один из ответов не помог. Я попытался использовать несколько объектов потока (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
Вы можете проверить наличие 'InnerException' ошибок, которые находятся в заброшенном исключения, а? С помощью 'XmlSerializer' эти внутренние исключения обычно содержат соответствующую информацию. –
Это известная ошибка/«ограничение» для «XmlSerializer». См. [Как сериализовать нестатический дочерний класс статического класса] (http://stackoverflow.com/questions/4479817/how-to-serialize-non-static-child-class-of-static-class). Обходные пути - это развязать вложенный класс или использовать «DataContractSerializer» или сделать внешний класс нестатическим, но с закрытым конструктором, который генерирует исключение. – dbc
@dbc, спасибо. см. мой ответ –