序列化数组时出现问题

时间:2012-03-16 16:23:29

标签: c# arrays serialization

所以我觉得自己像个菜鸟,但是这一直困扰着我或者几个小时,虽然我已经阅读了很多问题/教程但我似乎无法完成这项工作。毫无疑问,这是一个根本问题,我遇到的很明显,我完全错过了它。无论如何,所以问题就是这个。我有一个类,它按照我想要的方式序列化,就像这样;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using System.Text;

namespace SMCProcessMonitor
{

public class Config
{
    private string recipient = "";
    private int serverport;
    private string username = "";
    private string password = "";

    public Config()
    {
    }

    public string Recipient
    {
        get
        {
            return recipient;
        }
        set
        {
            recipient= value;
        }
    }

接下来是不同变量的获取/设置。这很好,但这是我正在努力的下一步。因为这些只处理代码的单个实例,这相对容易,但我希望添加的下一部分是一个程序列表,可能看起来像

<program>
  <programname>program1</programname>
  <programfilepath>C:/...</programfilepath>
</program>
<program>
<programname>program2</programname>
 <programfilepath>D:/...</programfilepath>
</program>

我假设在这里我想使用数组来存储序列化时的不同程序,例如,我尝试了许多不同的方法,但没有用。如果我创建以下类来保存我的数组细节,如下所示:

public class Company
{
    public programs[] Programs;
}
public class Programs
{
    public string mFileName;
    public string mFilePath;
}

然后我来使用这个数组来填充数据,并使用以下代码调用它:

        SMCProcessMonitor.ConfigManager.mConfigurations.programs = sFile;

左侧看起来很好,但是尝试将其分配给变量sFile(这是一个包含文件名的字符串)我得到了几个错误(取决于我尝试的内容,例如sFile.ToArray等等,但是即转换错误,例如:

无法将类型'string'隐式转换为'SMCProcessMonitor.Config.Programs []'

所以问了这个冗长的问题......任何人都有任何指针,或者提示我哪里出错了?就像我说的那样,我确定它的一些愚蠢的基础,我无法掌握..

提前干杯, 沙恩。

4 个答案:

答案 0 :(得分:2)

对于动态大小的集合,使用数组有点麻烦。最简单的方法可能是使用List,使其看起来像;

public class Company
{
    public List<Program> Programs = new List<Program>();
}
public class Program
{
    public string FileName;
    public string FilePath;
}

添加条目会看起来像;

Programs.Add(new Program { FileName = sFile, FilePath = sPath });

...您可以使用...

访问它
var theFirstProgram = Programs[0];

答案 1 :(得分:0)

对于数组中的每个条目,您必须添加一个新的程序条目,因此您需要创建一个程序,并将字符串添加到该程序(mFilename,mFilePath),然后将其添加到数组中。

您还需要一些空间用于阵列。

答案 2 :(得分:0)

XMLArray属性?

您还可以使用XMLAttribute来允许在XML标记中添加属性,这样更容易阅读,并且可用于保持需要编辑的XML文件易于遵循。

示例...

public class Army
{
    // Fields
    private List<UnitCategory> _unitCategory;
    private string _armyName;

    // Properties
    [XmlArray("unit-category")]
    public List<UnitCategory> UnitCategory
    {
        get { return _unitCategory; }
        set { _unitCategory = value; }
    }
}
    [XmlAttribute("name")]
    public string ArmyName
    {
        get { return _armyName; }
        set { _armyName = value; }
    }

答案 3 :(得分:0)

问题是sFile字符串,并且您正尝试将其分配给数组

您需要首先加载sFile表示的文件,例如:

var fileStream = File.Open(sFile, FileMode.Open);

接下来,您需要将文件内容反序列化为对象图:

var xs = new XmlSerializer(typeof(Company));

// this will raise an error if the contents don't match the expected object type
// else will return the Company object.
var data = (Company)xs.Deserialize(fileStream);  

然后,您将能够将反序列化的对象分配给您的配置:

SMCProcessMonitor.ConfigManager.mConfigurations.programs = data.Programs;

我想说的一点是,CompanyPrograms的类定义不会根据您提供的XML正确反序列化。您将不得不使用一些XmlAttributes来提供XML元素和对象图之间的正确对应。