如何进行类对象的XML序列化?

3

我正在尝试将一个类对象序列化并存储为xml字符串,但每次都会出现异常消息“生成xml文档时出错”。

我要序列化的类对象是:

[XmlRoot("FlowOfTask")] 
public class Flow
{
    int _CurrHop = 0;

    [XmlElement("CurrentHop")]
    public int CurrentHop
    {
        get { return _CurrHop; }
        set { _CurrHop = value; }
    }

    int _TotalHops = 0;

    [XmlElement("TotalHops")]
    public int TotalHops
    {
        get { return _TotalHops; }
    }

    private List<tblTaskHop> _TaskHops;

    [System.Xml.Serialization.XmlArrayItemAttribute(ElementName = "Hop",
    IsNullable = false)]
    public List<tblTaskHop> TaskHops
    {
        get { return _TaskHops; }
    }
    public Flow()
    {

    }

    public Flow(Int64 TaskID, Int64 RoleID)
    {
        _TaskHops = HandleDB.tblTaskHopGetByTaskIDRoleID(TaskID, RoleID);
        _TotalHops = TaskHops.Count;
    }

}

我正在使用此函数进行序列化。

public static string SerializeAnObject(object item)
{

    try
    {
        string xmlText;

        //Get the type of the object
        Type objectType = item.GetType();

        //create serializer object based on the object type
        XmlSerializer xmlSerializer = new XmlSerializer(objectType);

        //Create a memory stream handle the data
        MemoryStream memoryStream = new MemoryStream();

        //Create an XML Text writer to serialize data to
        using (XmlTextWriter xmlTextWriter =
            new XmlTextWriter(memoryStream, Encoding.UTF8) { Formatting = Formatting.Indented })
        {

            //convert the object to xml data
            xmlSerializer.Serialize(xmlTextWriter, item);

            //Get reference to memory stream
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;

            //Convert memory byte array into xml text
            xmlText = new UTF8Encoding().GetString(memoryStream.ToArray());

            //clean up memory stream
            memoryStream.Dispose();
            return xmlText;
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
        return null;
    }
}

有人能帮我解释一下为什么我无法序列化这个类对象吗?

2个回答

2

你的序列化方法应该像这样:

public static string SerializeAnObject(Object item) {
    if (item == null)
        return null;

    var stringBuilder = new StringBuilder();
    var itemType = item.GetType();

    new XmlSerializer(itemType).Serialize(new StringWriter(stringBuilder), item);

    return stringBuilder.ToString();
}

当我像这样测试时,上面的函数可以正常工作:

var test = new Flow();
var xmlString = SerializeAnObject(test);

谢谢您的快速回复!我尝试在try-catch块中使用此代码,但没有成功,仍然遇到了相同的异常“生成XML错误”。 - Muhammad Tahir
确保您的对象 tblTaskHop 也可以被序列化。 - Yuck
tblTaskHop是从数据库表自动生成的Linq2SQL类。它已经可序列化了吗,还是我需要将其设为可序列化? - Muhammad Tahir
1
问题在于tblTaskHop不可序列化,因为它是自动生成的Linq to Sql类。因此,在创建一个与tbltaskhop相同的虚拟类后,我才能够序列化该对象。 - Muhammad Tahir

1
XML序列化器要求公共属性可读可写。TotalHops和TaskHops符合此标准。
尝试类似以下的代码:
public class Flow
{
    public int CurrentHop { get; set; }
    public int TotalHops { get; set; }
    [XmlArrayItem(ElementName = "Hop", IsNullable = false)]
    public List<tblTaskHop> TaskHops { get; set; }
}

请注意,Type tblTaskHop 必须遵循相同的规则。
此外,@Yuck 有一个更好的序列化函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接