序列化 Class 个实例未返回 XML
Serialized Class instance not returning XML
我有一个方法可以将 return 作为 class 到 XML 的实例。不幸的是,没有 XML 被 return 编辑。
下面是一个尝试将简单国家 Class 转换为 XML 的示例:
国家/地区Class
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"]);
}
继承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() + "***";
}
运行时没有错误。我从我的标签中得到的只是“******”
如有任何帮助,我们将不胜感激。
谢谢。
我会放弃 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;
}
尝试更改此...我删除了您的一些代码以使其对我有用,因此它是一个模板:
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());
}
}
问题是您的属性是 readonly
,XmlSerializer
无法处理。
我会遵循 this answer 以获得您正在寻找的相同结果。
我认为 [DataSerializer]
方法可能对您有最大帮助。您只需将属性更改为以下内容:
[DataSerializer]
public int Id { get; private set; }
这样,它们仍然是 "readonly",但您可以那样序列化它们。
我有一个方法可以将 return 作为 class 到 XML 的实例。不幸的是,没有 XML 被 return 编辑。
下面是一个尝试将简单国家 Class 转换为 XML 的示例:
国家/地区Class
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"]);
}
继承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() + "***";
}
运行时没有错误。我从我的标签中得到的只是“******”
如有任何帮助,我们将不胜感激。 谢谢。
我会放弃 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;
}
尝试更改此...我删除了您的一些代码以使其对我有用,因此它是一个模板:
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());
}
}
问题是您的属性是 readonly
,XmlSerializer
无法处理。
我会遵循 this answer 以获得您正在寻找的相同结果。
我认为 [DataSerializer]
方法可能对您有最大帮助。您只需将属性更改为以下内容:
[DataSerializer]
public int Id { get; private set; }
这样,它们仍然是 "readonly",但您可以那样序列化它们。