序列化类实例不返回XML

时间:2015-02-26 13:04:51

标签: c# asp.net .net linq-to-xml

我有一个方法可以将类的实例作为XML返回。不幸的是,没有返回XML。

以下是尝试将简单国家/地区类转换为XML的示例:

国家/地区类

public class Country : XmlMethods<Country>
{
    public readonly int Id;
    public readonly string Code;
    public readonly string Name;

private Country()
{
}

private Country(int id, string code, string name)
{
    Id = id;
    Code = code;
    Name = name;
}

public static Country Load(int countryId)
{
    DataRow dr = //Row From Database

    return new Country(
            (int)dr["ISOCountryID"],
            (string)dr["ISOCode"],
            (string)dr["ISOCountry"]);
}

Inhertited Class

public class XmlMethods<T> : BaseClass
{
    public XElement ToXElement()
    {
        using (var memoryStream = new MemoryStream())
        {
            using (TextWriter streamWriter = new StreamWriter(memoryStream))
            {
                var xmlSerializer = new XmlSerializer(typeof (T));
                xmlSerializer.Serialize(streamWriter, this);
                return XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
            }
        }
    }
}

测试方法

public void LoadCountry()
{
    lbl.Text = "***" + Country.Load(1).ToXElement().ToString() + "***";
}

运行时没有错误。我从标签上得到的只是&#39; ******&#39;

非常感谢任何帮助。 感谢。

3 个答案:

答案 0 :(得分:1)

尝试更改此内容...我删除了您的一些代码,以便让我能够为其工作,以便将其作为模板:

public class Country : XmlMethods<Country>
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }

    private Country()
    {
    }

    private Country(int id, string code, string name)
    {
        Id = id;
        Code = code;
        Name = name;
    }

    public static Country Load(int countryId)
    {
        //test implementation
        return new Country(
                1,
                "some",
                "someother");
    }
}

public class XmlMethods<T>
{
    public XElement ToXElement()
    {
        StringBuilder xml = new StringBuilder();

        var xmlSerializer = new XmlSerializer(typeof(T));
        xmlSerializer.Serialize(new StringWriter(xml), this);
        return XElement.Parse(xml.ToString());
    }
}

答案 1 :(得分:1)

问题是您的属性为readonlyXmlSerializer无法处理。

我会关注this answer,以达到您所寻找的相同结果。

我认为[DataSerializer]方法可能对您有所帮助。您只需将属性更改为以下内容:

[DataSerializer]
public int Id { get; private set; }

这样,他们仍然只是&#34; readonly&#34;,但你可以通过这种方式序列化它们。

答案 2 :(得分:0)

我会抛弃MemoryStream和StreamWriter并使用https://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.createwriter%28v=vs.110%29.aspx,例如。

public XElement ToXElement()
{
    XDocument doc = new XDocument();
    using (XmlWriter xw = doc.CreateWriter())
    {

            var xmlSerializer = new XmlSerializer(typeof (T));
            xmlSerializer.Serialize(xw, this);
    }

    return doc.Root;
}