繁体   English   中英

C# 通过反序列化读取 XML 配置文件

[英]C# read XML config file through deserialize

我正在尝试创建一个非常简单的 class、object,其中在变量初始化阶段读取指定的 XML 文件,并使来自所述 XML 的值可用作只读属性

所以我需要将它的路径作为字符串提供给以下结构:

<?xml version="1.0" encoding="utf-8"?>
<PLEXUpdateConfig>
    <Release>1</Release>
    <InstallPath>%ProgramW6432%</InstallPath>
    <CheckEveryXMinutes>20</CheckEveryXMinutes>
</PLEXUpdateConfig>

...然后像这样参考它:

Console.WriteLine("Release {0}, path {1}, interval {2} minutes", vConfigFile.Release, vConfigFile.InstallPath, vConfigFile.CheckEveryXMinutes);

现在我有这个 class:

public class PLEXUpdateConfig
{
    public uint Release { get; }
    public string InstallPath { get; }
    public uint CheckEveryXMinutes { get; }


    public class XMLStructure
    {
        public String Release { get; set; }
        public String InstallPath { get; set; }
        public String CheckEveryXMinutes { get; set; }

        public override string ToString()
        {
            return $"(Release: {Release}, InstallPath: {InstallPath}, CheckEveryXMinutes {CheckEveryXMinutes})";
        }
    }

    public PLEXUpdateConfig(string filePath)
    {
        XMLStructure vConfig;

        using (var reader = new StreamReader(filePath))
        {
            vConfig = (XMLStructure)new XmlSerializer(typeof(XMLStructure)).Deserialize(reader);
        }

        Release = (uint)int.Parse(vConfig.Release);
        InstallPath = vConfig.InstallPath;
        CheckEveryXMinutes = (uint)int.Parse(vConfig.CheckEveryXMinutes);

    }
}

...我正试图像这样从 Main 调用:

var vConfigFile = new PLEXUpdateConfig(vProgram.gReleaseFilePath);

而且它不起作用,抱怨保护级别:

Unhandled Exception: System.InvalidOperationException: plex_update_cmd.Program is inaccessible due to its protection level. Only public types can be processed.
   at System.Xml.Serialization.TypeDesc.CheckSupported()
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type)
   at plex_update_cmd.Program.PLEXUpdateConfig..ctor(String filePath) in ..\plex-update.cs:line 46
   at plex_update_cmd.Program.Main(String[] args) in ..\plex-update.cs:line 64

但是PLEXUpdateConfig class 和嵌套的 XMLStructure class 都尽可能公开,所以我真的不明白问题出在哪里。 请你帮助我好吗?

为什么声明一个内部 class 用于配置? 在这种情况下,有独家新闻是正常的。 另外,内部的class有相同的变量名。

请试试这个

public class PLEXUpdateConfig
{
    public uint Release { get; }
    public string InstallPath { get; }
    public uint CheckEveryXMinutes { get; }


    public PLEXUpdateConfig(string filePath)
    {
        XMLStructure vConfig;

        using (var reader = new StreamReader(filePath))
        {
            vConfig = (XMLStructure)new XmlSerializer(typeof(XMLStructure)).Deserialize(reader);
        }

        Release = (uint)int.Parse(vConfig.Release);
        InstallPath = vConfig.InstallPath;
        CheckEveryXMinutes = (uint)int.Parse(vConfig.CheckEveryXMinutes);
    }
}

    public class XMLStructure
    {
        public String Release { get; set; }
        public String InstallPath { get; set; }
        public String CheckEveryXMinutes { get; set; }

        public override string ToString()
        {
            return $"(Release: {Release}, InstallPath: {InstallPath}, CheckEveryXMinutes {CheckEveryXMinutes})";
        }
   }

事实证明,它与嵌套到 PLEXUpdateConfig 中的 XMLStructure 无关。 它是 PLEXUpdateConfig 被嵌套到程序 class 中。显然它也是不允许的。 当我将 PLEXUpdateConfig 移到程序 class 之外时,一切正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM