是否可以对返回字符串对象列表的属性(在 xml 序列化类中)进行 xml 序列化

本文关键字:序列化 xml 进行 属性 返回 字符串 列表 对象 是否 | 更新日期: 2023-09-27 18:32:52

我有一个类,我们称之为员工,它有一个资格列表作为属性

[XmlRoot("Employee")]
public class Employee
{
    private string name;
    private IListManager<string> qualification = new ListManager<string>();
    public Employee()
    {
    }
    [XmlElement("Name")]
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            if (value != null)
            {
                name = value;
            }
        }
    }
    public ListManager<string> QualificationList
    {
        get
        {
            return qualification as ListManager<string>;
        }
    }
    [XmlElement("Qual")]  
    public string Qualifications
    {
        get
        {
            return ReturnQualifications();
        }
    }
    private string ReturnQualifications()
    {
        string qual = string.Empty;
        for (int i = 0; i < qualification.Count; i++)
        {
            qual += " " + qualification.GetElement(i);
        }
        return qual;
    }
    public override String ToString()
    {
        String infFormat = String.Format("{0, 1} {1, 15}", this.name, Qualifications);
        return infFormat;
    }
}

}

然后我有一个方法,它通过获取员工列表作为 patameter 来序列化上面的类 tom XML,该方法是通用的:

public static void Serialize<T>(string path, T typeOf)
        {
            XmlSerializer xmlSer = new XmlSerializer(typeof(T));
            TextWriter t = new StreamWriter(path);
            try
            {
                xmlSer.Serialize(t, typeOf);
            }
            catch
            {
                throw;
            }
            finally
            {
                if (t != null)
                {
                    t.Close();
                }
            }
        }

这就是我如何调用XMLSerialize方法:

controller.XMLSerialize<Employee>(opnXMLFileDialog.FileName, employeeList);

方法执行的结果返回一个文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfEmployees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Employees>
    <Name>g</Name>
  </Employees>
</ArrayOfEmployees>

如您所见,文件中仅包含属性名称。我如何从这里开始并序列化资格列表?任何建议将不胜感激。提前谢谢。

是否可以对返回字符串对象列表的属性(在 xml 序列化类中)进行 xml 序列化

为了序列化属性,XmlSerializer要求属性同时具有公共资源库和公共获取器。 因此,无论您选择什么属性来序列化您的资格,都必须有一个二传手和一个 getter。

显而易见的解决方案是让您的QualificationList既有二传手又有吸气手:

public ListManager<string> QualificationList
{
    get
    {
        return qualification as ListManager<string>;
    }
    set
    {
        qualification = value;
    }  
}

如果由于某种原因无法执行此操作 - 可能是因为您的ListManager<string>类不可序列化 - 您可以将其序列化和反序列化为字符串的代理数组,如下所示:

    [XmlIgnore]
    public ListManager<string> QualificationList
    {
        get
        {
            return qualification as ListManager<string>;
        }
    }
    [XmlElement("Qual")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public string[] QualificationArray
    {
        get
        {
            return Enumerable.Range(0, qualification.Count).Select(i => qualification.GetElement(i)).ToArray();
        }
        set
        {
            // Here I am assuming your ListManager<string> class has Clear() and Add() methods.
            qualification.Clear();
            if (value != null)
                foreach (var str in value)
                {
                    qualification.Add(str);
                }
        }
    }

然后是以下员工列表:

        var employee = new Employee() { Name = "Mnemonics" };
        employee.QualificationList.Add("posts on stackoverflow");
        employee.QualificationList.Add("easy to remember");
        employee.QualificationList.Add("hard to spell");
        var list = new List<Employee>();
        list.Add(employee);

将生成以下 XML:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfEmployee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Employee>
        <Name>Mnemonics</Name>
        <Qual>posts on stackoverflow</Qual>
        <Qual>easy to remember</Qual>
        <Qual>hard to spell</Qual>
    </Employee>
</ArrayOfEmployee>

这令人满意吗?

相关文章: