- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下类定义
[XmlRoot(ElementName = "person",Namespace = "MyNamespace")]
public class Person : IXmlSerializable
{
public string FirstName { get; set; }
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces Namespaces
{
get
{
var xmlSerializerNamespaces = new XmlSerializerNamespaces();
xmlSerializerNamespaces.Add("My", "MyNamespace");
return xmlSerializerNamespaces;
}
}
public string LastName { get; set; }
public XmlSchema GetSchema()
{
return null;
}
/// <exception cref="NotSupportedException"/>
public void ReadXml(XmlReader reader)
{
throw new NotSupportedException();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("firstName",FirstName);
writer.WriteElementString("lastName", LastName);
}
}
var xmlSerializer = new XmlSerializer(typeof(Person));
var person = new Person
{ FirstName = "John",LastName = "Doe"};
xmlSerializer.Serialize(Console.Out, person, person.Namespaces);
<?xml version="1.0" encoding="ibm850"?>
<My:person xmlns:My="MyNamespace">
<My:firstName>John</My:firstName>
<My:lastName>Doe</My:lastName>
</My:person>
<?xml version="1.0" encoding="ibm850"?>
<person xmlns="MyNamespace">
<firstName>John</firstName>
<lastName>Doe</lastName>
</person>
最佳答案
XmlSerializer
type 不提供任何开箱即用的东西来处理这个问题。
如果你真的需要使用XmlSerializer
,你最终会得到一个自定义 XmlSerializer
实现,它不是很开放扩展。出于这个原因,下面的实现更像是一个概念证明,只是为了给你一个想法或一个起点。
为简洁起见,我省略了任何错误处理,仅关注 Person
在你的问题中上课。还有一些工作要做来处理任何嵌套的复杂属性。
如 Serialize
方法不是 virtual
我们将不得不给他们留下阴影。主要思想是将所有重载定向到具有自定义实现的单个重载。
由于自定义,我们必须在 Person
中更加明确通过指定要应用的 xml 命名空间,在为其属性编写 xml 元素时使用类。
下面的代码
PrefixedXmlSerializer xmlSerializer = new PrefixedXmlSerializer(typeof(Person));
Person person = new Person {
FirstName = "John",
LastName = "Doe"
};
xmlSerializer.Serialize(Console.Out, person, person.Namespaces);
<My:person xmlns:My="MyNamespace">
<My:firstName>John</My:firstName>
<My:lastName>Doe</My:lastName>
</My:person>
<My:person xmlns:My="MyNamespace">
等于
<person xmlns="MyNamespace">
.
[XmlRoot(ElementName = "person", Namespace = NAMESPACE)]
public class Person : IXmlSerializable
{
private const string NAMESPACE = "MyNamespace";
public string FirstName { get; set; }
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces Namespaces
{
get
{
var xmlSerializerNamespaces = new XmlSerializerNamespaces();
xmlSerializerNamespaces.Add("My", NAMESPACE);
return xmlSerializerNamespaces;
}
}
public string LastName { get; set; }
public XmlSchema GetSchema()
{
return null;
}
/// <exception cref="NotSupportedException"/>
public void ReadXml(XmlReader reader)
{
throw new NotSupportedException();
}
public void WriteXml(XmlWriter writer)
{
// Specify the xml namespace.
writer.WriteElementString("firstName", NAMESPACE, FirstName);
writer.WriteElementString("lastName", NAMESPACE, LastName);
}
}
public class PrefixedXmlSerializer : XmlSerializer
{
XmlRootAttribute _xmlRootAttribute;
public PrefixedXmlSerializer(Type type) : base(type)
{
this._xmlRootAttribute = type.GetCustomAttribute<XmlRootAttribute>();
}
public new void Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
{
// Out-of-the-box implementation.
XmlTextWriter xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.Indentation = 2;
// Call the shadowed version.
this.Serialize(xmlTextWriter, o, namespaces, null, null);
}
public new void Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
{
// Lookup the xml namespace and prefix to apply.
XmlQualifiedName[] xmlNamespaces = namespaces.ToArray();
XmlQualifiedName xmlRootNamespace =
xmlNamespaces
.Where(ns => ns.Namespace == this._xmlRootAttribute.Namespace)
.FirstOrDefault();
// Write the prefixed root element with its xml namespace declaration.
xmlWriter.WriteStartElement(xmlRootNamespace.Name, this._xmlRootAttribute.ElementName, xmlRootNamespace.Namespace);
// Write the xml namespaces; duplicates will be taken care of automatically.
foreach (XmlQualifiedName xmlNamespace in xmlNamespaces)
{
xmlWriter.WriteAttributeString("xmlns", xmlNamespace.Name , null, xmlNamespace.Namespace);
}
// Write the actual object xml.
((IXmlSerializable)o).WriteXml(xmlWriter);
xmlWriter.WriteEndElement();
}
}
关于xml-serialization - 如何为 IXmlSerializable 类型添加命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51590112/
我需要能够对内部类进行 Xml 序列化,因此我必须实现 IXmlSerializable。 这个类有两个字符串和一个列表。 我知道使用 WriteElementString 和 ReadElement
我有一个看起来像这样的 xml 文件: value value value value 我有两个对象代表这个 xml: class
.NET 中的 XML 序列化通过 XmlSerializer 构造函数的 extraTypes[] 参数允许多态对象。它还允许为实现 IXmlSerializable 的类型自定义 XML 序列化。
我正在实现 IXmlSerializable对于我的类的自定义(反)序列化逻辑,但希望根据 XSD 模式检查 XML 的读写。我添加了 XmlSchemaProviderAttribute : [Xm
假设我有两个类,一个基类和一个派生类。它们是相当简单的类,主要充当数据结构(派生类显然稍微复杂一些)。 public class BaseUserSession { // ... Variou
我试图创建一个通用的 Dictionary实现 IXmlSerializable (归功于 Charles Feduke )。 这是我的试验: Sub Main() Dim z As New
我正在构建一个将数据公开为 XML 的 REST API。我的域层中有一大堆域类,供 API 后面的服务层和我们将提供给客户的客户端 API 使用。 (客户确实可以选择直接与 REST API 交互,
是否有任何标记为 IXmlSerializable 的 .NET 通用集合?我已经尝试过 List 和 Collection,但都没有开箱即用。 在我推出自己的 collection、list 或 d
我对 xml 序列化有一个奇怪的要求。 请引用以下 C# 代码(由于变量 'rootName' 超出范围而无法编译)。我的意图是让我的类(class) GeneralData 成为“一般”。这意味着该
我有一个类: [Serializable] public class Profile { [XmlAttribute] private string[] permissions;
我想对我的对象 Exception 的实例进行 XML 序列化,并将其存储在另一个对象 ExceptionReport 的 XMLNode[] Nodes 属性中。 [System.Diagnosti
我有一个实现 IXmlSerializable 的类,如下所示: public class SomeClass : IXmlSerializable { public SomeSerializ
一旦程序员决定实现IXmlSerializable,实现它的规则和最佳实践是什么?我听说 GetSchema() 应该返回 null 并且 ReadXml 应该在返回之前移动到下一个元素。这是真的?那
我有这样的 xml: 2 6,501698000000 8,414278000000 9,29
对于要使用的正确装饰器或可能需要的任何设计有点困惑。当序列化一个实现 IXmlSerializable 的类时,有没有办法在 XmlRoot 元素中包含命名空间及其前缀? 例如类定义。 using S
我有以下类定义 [XmlRoot(ElementName = "person",Namespace = "MyNamespace")] public class Person : IXmlSerial
我有一个自定义类型的集合属性,它继承自 BindingList。目前,此属性通过 XmlSerializer 进行序列化,即使它没有 Setter。我现在正尝试在此自定义集合类上实现 IXmlSeri
初始问题 我要serialize一个List更改 IXmlSerializable 的 XmlType动态分类(所以我不能使用属性标签来做到这一点) 我已经尝试使用 XmlAttributeOverr
我发现 XmlSerializer 有一些有趣的行为。 如果我尝试序列化一个具有 Type 对象属性并且该对象实现了 IXmlSerializable 的类,序列化程序将抛出一个 InvalidOpe
基本上,最初的问题是我需要将 bool 值序列化为 0 或 1。我找到的解决方案是实现 IXmlSerializable,我确实这样做了。不幸的是,我试图序列化的类是从模式生成的代码,并且上面有一个
我是一名优秀的程序员,十分优秀!