【问题标题】:c# serialize object without root elementc#序列化没有根元素的对象
【发布时间】:2017-09-11 10:43:12
【问题描述】:

我正在与第三方合作,该第三方具有用于多个不同请求的 xml 结构。

每个请求都有一个共同的标头结构,然后是一些特定的页脚数据。

不幸的是,页眉和页脚部分没有包含在它们自己的元素标签中,这是我无法更改的。

一些人为的请求示例如下所示:

样品请求 1

<?xml version="1.0" encoding="UTF - 8" standalone="yes"?>
<Request>
    <RequestType>1</RequestType>
    <User>User01</User>
    <id>1234</id>
    <Name>John</Name>
    <Age>20</Age>
</Request>

示例请求 2

<?xml version="1.0" encoding="UTF - 8" standalone="yes"?>
<Request>
    <RequestType>2</RequestType>
    <User>User02</User>
    <id>1235</id>
    <School>The School</School>
    <Teacher>Mrs Smith</Teacher>
</Request>

样品请求 3

<?xml version="1.0" encoding="UTF - 8" standalone="yes"?>
<Request>
    <RequestType>3</RequestType>
    <User>User01</User>
    <id>223</id>
    <Work>The Office</Word>
    <Boss>Mr White</Boss>
    <Phone>1234567</Phone>
    <Payday>Friday</Payday>
</Request>

可以看到每个请求都有一个RequestTypeUserid

我的问题与编写将封装此 Xml 以进行序列化的 C# 代码有关。

对我来说,让我的每个 C# 类都有重复的标头(RequestTypeUserid)似乎错误 ) 数据。

我尝试过使用泛型(请参阅下面的示例代码),但这导致了我的问题。

问题:如何序列化我的通用对象Footer,使其不被包裹在“根”页脚元素中?

[System.Xml.Serialization.XmlRoot("Request")]
public class GenericRequest<typeT>
{
    public GenericRequest()
    {
    }

    public int RequestType { get; set; }

    public string User { get; set; }

    public int id { get; set; }

    public typeT Footer { get; set; }
}

【问题讨论】:

  • 这不是一个有效的 xml。如果您知道分隔符,则可以进行拆分并一一解析。
  • 我已编辑问题以使示例更清晰 - 对造成的任何混淆表示歉意。

标签: c# xml serialization


【解决方案1】:

您可以创建一个具有接口 IFooter 的类,该类可以根据需要具有不同的实现者(例如

interface IFooter : ISerializable 
{
 //Define common member.
}

public class Footer1: IFooter
{
 // define members (e.g. work) 
}

public class Footer2: IFooter
{
 // define members 
}

public class Footer3: IFooter
{
 // define members 
}

现在序列化主类

[System.Xml.Serialization.XmlRoot("Request")]
public class GenericRequest
{
  public GenericRequest()
  {
  }


  public int RequestType { get; set; }

  public string User { get; set; }

  public int id { get; set; }

  public IFooter Footer { get; set; }
}

请访问How can I serialize an object that has an interface as a property? 以供参考。

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多