.net - .NET 中的 XML 序列化选项

标签 .net xml-serialization

我正在构建一个返回 XML 的服务(没有 SOAP,没有 ATOM,只是普通的旧 XML)。假设我的域对象已经填充了数据,只需将它们转换为 XML 格式。我在 .NET 上有哪些选择?

要求:

  • 转换不是 1:1。假设我有一个 Address 类型的 Address 属性,其中包含 Line1、City、Postcode 等嵌套属性。这可能需要生成像 <xaddr city="...">Line1, Postcode</xaddr> 这样的 XML ,即完全不同。
  • 某些 XML 元素/属性是有条件的,例如,如果客户未满 18 岁,则 XML 需要包含一些附加信息。
  • 我只需要将对象序列化为XML,其他方向(XML转对象)并不重要
  • 某些技术,即数据协定使用 .NET 属性。其他配置方式(外部 XML 配置、伙伴类等)将是一个加分项。

以下是我目前认为的选项。非常欢迎更正/补充。

  • 字符串连接 - 算了,这是个笑话 :)
  • Linq 2 XML - 完全控制,但需要大量手写代码,需要良好的单元测试套件
  • View 引擎在 ASP.NET MVC(理论上甚至是 Web 窗体)中,逻辑在 Controller 中。如何构建它是一个问题,我可以在我的 Controller 中拥有简单的规则引擎,并且每个可能的输出都有一个 View 模板,或者直接在模板中拥有决策逻辑。两者都有优点和缺点。
  • XML 序列化 - 我不确定这里的灵 active
  • Data Contracts 来自 WCF - 也不确定灵 active ,另外它们是否可以在简单的 ASP.NET MVC 应用程序(非 WCF 服务)中工作?它们现在是标准 XML 序列化的超集吗?
  • 如果存在,一些 XML 到对象的映射器。我越想越觉得我在寻找这样的东西,但我找不到合适的东西。

有什么意见/其他选择吗?

最佳答案

Xml 序列化工作得很好。 您使用属性来配置它。

您可以有条件地包含元素。

编辑:我已更新代码以反射(reflect)您更新后的问题。

[XmlRoot("pdata")]  // this element name used if serialized to doc root
public class PersonalData
{
     [XmlElement]  // with no name here, elt name = prop name
     public string Name;

     [XmlElement]  // with no name here, elt name = prop name
     public int Age;

     [XmlElement("xaddr")]  // override xml element name 
     public AddressData Address;

     [XmlElement] 
     public Under18Info Other {get; set;}

     // serialize the above element, only if Age < 18
     [XmlIgnore] // do not serialize the *Specified" property in any case
     private bool OtherSpecified {
        get { return Age < 18; }
     }
}

public class AddressData
{
     [XmlIgnore]   // do not serialize (see Composite prop)
     public string Line1 { get; set;}

     [XmlAttribute("city")] // serialize as an attribute on the parent 
     public string City {get; set;}

     [XmlIgnore]   // do not serialize 
     public string Postcode {get; set;}

     [XmlText]   // serialize as the Text node
     public string Composite 
     {
        get { return Line1 + ", " + Postcode; }
        set {
          var split = value.Split(',');
          Line1 = split[0];
          Postcode= split[1];
        }
     }
}

然后,将其实例序列化为字符串,例如:

var pdata = new PersonalData
    {
        Name = "Gordon Brown",
        Age = 57,
        Address = new AddressData
        {
            Line1 = "10 Downing St.",
            Postcode = "1QR 3E4",
            City = "London"
        }
    };

var ns= new System.Xml.Serialization.XmlSerializerNamespaces();
ns.Add( "", "");
var s1 = new XmlSerializer(typeof(PersonalData));
var builder = new System.Text.StringBuilder();
var xmlws = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };
using ( var writer = System.Xml.XmlWriter.Create(builder, xmlws))
{
    s1.Serialize(writer, pdata, ns);
}
string xml = builder.ToString();

结果:

<pdata>
  <Name>Gordon Brown</Name>
  <Age>57</Age>
  <xaddr city="London">10 Downing St., 1QR 3E4</xaddr>
</pdata>

关于.net - .NET 中的 XML 序列化选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2809723/

相关文章:

c# - 将对象连同静态成员变量序列化为 XML

.net - ASP.NET MVC : How to Route Search Term with . (Period) 结尾

c# - 为什么不能推断出嵌套的泛型类型?

数组的 C# XML 序列化 - 跳过 "empty"字符串值

mysql - 从 MySQL 数据库获取数据时如何在 XML 文件中追加多个子根节点

c++ - 为什么 boost::serialization 不检查 XML 文件中的标签名称?

Javascript序列化窗口对象

.net - SQL 查询的包装器

.net - Wpf 用户安全策略

.net - 特定实体的 ObjectContext.SaveChanges?