【问题标题】:Not possible to XML data from object无法从对象获取 XML 数据
【发布时间】:2015-08-26 13:46:32
【问题描述】:

我有一个非常简单的应用程序,其中一个 XML 文件被反序列化为对象。当我尝试从对象中读出值时,我得到null

我的 XML 文件如下所示:

 <?xml version="1.0" encoding="utf-8" ?>
    <Settings>
      <HomePage>http://www.google.dk</HomePage>
      <DefaultAudioLevel>100</DefaultAudioLevel>
    </Settings>

我的模型看起来像这样:

[Serializable()]
public class Settings
{   
    [XmlElement("HomePage")]
    public string Homepage { get; set; }

    [XmlElement("DefaultAudioLevel")]
    public string DefaultAudioLevel { get; set; }
}

还有SettingSerializer.cs

public class SettingSerializer
{
    private string path;
    private string EXE = Assembly.GetExecutingAssembly().GetName().Name;
    Settings settings = null;

    public SettingSerializer(string xmlPath = null)
    {
        path = new FileInfo(xmlPath ?? EXE + ".xml").FullName.ToString();
    }

    public void Deserialize()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Settings));

        StreamReader reader = new StreamReader(path);
        settings = (Settings)serializer.Deserialize(reader);
        reader.Close();
    }
}

还有我的测试课:

static void Main(string[] args)
{
    SettingSerializer serializer = new SettingSerializer();

    serializer.Deserialize();

    Settings settings = new Settings();

    Console.WriteLine(settings.Homepage);    

    Console.WriteLine(settings.DefaultAudioLevel);

    Console.ReadKey();
}

谁能发现错误?

【问题讨论】:

  • 您在Main 中的settings 需要从serializer.Settings 分配,而不是新对象。您还需要公开 settings 字段,或者只需将反序列化设置为返回设置对象而不是 void,这样您就可以拥有 Settings settings = serializer.Deserialize()

标签: c# xml xml-serialization xml-deserialization


【解决方案1】:

将您的 Serializer 更改为:

public class SettingSerializer
{
    private string path;
    private string EXE = Assembly.GetExecutingAssembly().GetName().Name;

    public SettingSerializer(string xmlPath = null)
    {
        path = new FileInfo(xmlPath ?? EXE + ".xml").FullName.ToString();
    }

    public Settings Deserialize()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Settings));

        StreamReader reader = new StreamReader(path);
        var settings = (Settings)serializer.Deserialize(reader);
        reader.Close();

        return settings;
    }
}

然后在你的主要方法中你可以这样做:

static void Main(string[] args)
{
    SettingSerializer serializer = new SettingSerializer();

    Settings settings = serializer.Deserialize();

    Console.WriteLine(settings.Homepage);    

    Console.WriteLine(settings.DefaultAudioLevel);

    Console.ReadKey();
}

正如您最初所拥有的那样,被反序列化的 settings 与 main 方法中包含的 settings 之间没有任何联系。您只需创建一个新对象并打印出其默认值,在您的情况下为 null 或空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多