继我之前的问题之后,我一直致力于将我的对象模型序列化为XML.但我现在遇到了一个问题(quelle surprise!).
我遇到的问题是我有一个集合,它是一个抽象的基类类型,由具体的派生类型填充.
我认为只需将XML属性添加到所涉及的所有类中,一切都会很好.可悲的是,事实并非如此!
所以我在谷歌上做了一些挖掘,现在我明白为什么它不起作用了.在该XmlSerializer其实是在为了序列化对象做一些聪明的反射/通过XML,并且因为它的基础上,抽象类型,它不能弄清楚到底是怎么回事了它的交谈.精细.
我确实遇到过CodeProject 上的这个页面,它看起来好像很有帮助(还没有完全阅读/消费),但我想我也想把这个问题带到StackOverflow表中,看看你是否有任何整洁黑客/技巧,以最快/最轻的方式启动和运行.
有一件事我还要补充的是,我不要想往下走XmlInclude的路线.与它有太多的耦合,系统的这个区域正在大量开发,所以这将是一个真正的维护头痛!
只是好奇为什么词典不受支持XmlSerializer?
你可以通过使用DataContractSerializer和写入对象来轻松地绕过它XmlTextWriter,但是如果XmlSerializer考虑到它真的是一个KeyValuePairs数组,那么字典的特征是什么使它难以处理.
实际上,你可以传递一个IDictionary<TKey, TItem>期望的方法IEnumerable<KeyValuePairs<TKey, ITem>>.
我已经能够以这种方式序列化IEnumerable:
[XmlArray("TRANSACTIONS")]
[XmlArrayItem("TRANSACTION", typeof(Record))]
public IEnumerable<BudgetRecord> Records
{
get
{
foreach(Record br in _budget)
{
yield return br;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我意识到现在我需要一个包含集合的字典Dictionary<string, RecordCollection>(RecordCollection实现IEnumerable).
我怎样才能做到这一点?
在这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.
我使用XSD.exe根据XML模式(.xsd文件)自动生成C#对象.我正在反序列化OpenCover输出,但其中一个部分类没有正确生成.
这是导致异常的行:
<MethodPoint xsi:type="SequencePoint" vc="0" uspid="1" ordinal="0" offset="0" sl="19" sc="9" el="19" ec="10" bec="0" bev="0" fileid="1" />
Run Code Online (Sandbox Code Playgroud)
这是MethodPoint类的缩短版本:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class CoverageSessionModulesModuleClassesClassMethodsMethodMethodPoint {
private string vcField;
private string uspidField;
private string ordinalField;
private string offsetField;
private string slField;
private string scField;
private string elField;
private string ecField;
private string becField;
private string bevField;
private string fileidField;
}
Run Code Online (Sandbox Code Playgroud)
现在我已经浏览了很多.xml文件,但OpenCover输出文件是唯一一个在属性中包含冒号的文件.MethodPoint对象也是唯一包含属性冒号的对象.如您所见,该类不包含该xsi:type属性,我知道只是添加它将因冒号而无效.你如何处理xsi前缀?
这是从其中一个OpenCover XML文件生成的原始.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="CoverageSession" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Summary">
<xs:complexType> …Run Code Online (Sandbox Code Playgroud) 我尝试使用 XMLSerializer 生成如下所示的 XML,其中 的内容<create>是一个数组,但元素可以是不同的类型(在本例中<vendor>为<customer>、 和<asset>)。这可能吗?
...
<create>
<vendor>
<vendorid>Unit - A-1212</vendorid>
<name>this is the name8</name>
<vcf_bill_siteid3>FOOBAR8</vcf_bill_siteid3>
</vendor>
<customer>
<CUSTOMERID>XML121</CUSTOMERID>
<NAME>XML Customer 111</NAME>
</customer>
<asset>
<createdAt>San Jose</createdAt>
<createdBy>Kevin</createdBy>
<serial_number>123456789</serial_number>
</asset>
</create>
....
Run Code Online (Sandbox Code Playgroud)