C# 将对象序列化为不带空元素和带空子元素的XML

C# 将对象序列化为不带空元素和带空子元素的XML,c#,.net,xml,serialization,xsd2code,C#,.net,Xml,Serialization,Xsd2code,我需要将对象序列化为XML请求,但我调用的服务不接受空元素 我从XSD生成了契约类,请求结构如下所示: /* Generated contracts - simplified & without XML attributes */ public class Request { public Request() { filters = new RequestFilters(); properties = new ResultPropertie

我需要将对象序列化为XML请求,但我调用的服务不接受空元素

我从XSD生成了契约类,请求结构如下所示:

/* Generated contracts - simplified & without XML attributes */
public class Request
{
    public Request()
    {
        filters = new RequestFilters();
        properties = new ResultProperties();
    }

    public RequestFilters filters { get; set; }

    public ResultProperties properties { get; set; }
}

public class ResultProperties
{
    public ResultProperties()
    {
        props = new List<string>();
    }
    public List<string> props { get; set; }
}

public class RequestFilters
{
    public RequestFilters()
    {
        ids = new LongFilter();
        names = new StringFilter();
    }

    public LongFilter ids { get; set; }
    public StringFilter names { get; set; }
}

public class LongFilter
{
    public LongFilter()
    {
        values = new List<long>();
    }

    public List<long> values { get; set; }
}

public class StringFilter
{
    public StringFilter()
    {
        values = new List<string>();
    }

    public List<string> values { get; set; }
}
我可以将其序列化为XML:

<?xml version="1.0" encoding="utf-16"?>
<Request xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <filters>
    <ids />
    <names />
  </filters>
  <properties>
    <props>
      <string>foo</string>
      <string>bar</string>
    </props>
  </properties>
</Request>

我通过创建
InitMethods
解决了这个问题,它将未使用的字段和集合设置为空

因此,与其这样做

Request request = new Request();

ResultProperties rp = new ResultProperties();
rp.props.Add("foo");
rp.props.Add("bar");

request.properties = rp;
我在做什么

Request InitRequest(RequestFilters filters = null, ResultProperties properties = null)
{
     Request request = new Request();
     request.filters = filters;
     request.properties = properties;

     return request;
}

RequestFilters InitRequestFilters(LongFilter ids = null, StringFilter names = null)
{
     RequestFilters filters = new RequestFilters();
     filters.ids = ids;
     filters.names = names;
}
初始化
ResultProperties
LongFilter
StringFilter
对象也是如此

然后我使用
InitMethods
创建请求:

List<string> properties = new List<string> { "foo", "bar" };
ResultProperties rp = InitResultProperties(properties);

Request request = InitRequest(properties: rp);

这不是最佳解决方案,因为创建
InitMethods
的开销很大,但我没有想出更好的解决方案。

xsd看起来怎么样?您使用的是
DataContractSerializer
还是
XmlSerializer
?您是在寻找一种手动执行此操作的方法,还是一种让xsd2code自动执行此操作的方法?我正在使用
XmlSerializer
,并希望尽可能使其自动化。
Request request = new Request();

ResultProperties rp = new ResultProperties();
rp.props.Add("foo");
rp.props.Add("bar");

request.properties = rp;
Request InitRequest(RequestFilters filters = null, ResultProperties properties = null)
{
     Request request = new Request();
     request.filters = filters;
     request.properties = properties;

     return request;
}

RequestFilters InitRequestFilters(LongFilter ids = null, StringFilter names = null)
{
     RequestFilters filters = new RequestFilters();
     filters.ids = ids;
     filters.names = names;
}
List<string> properties = new List<string> { "foo", "bar" };
ResultProperties rp = InitResultProperties(properties);

Request request = InitRequest(properties: rp);
<?xml version="1.0" encoding="utf-16"?>
<Request xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <properties>
    <props>
      <string>foo</string>
      <string>bar</string>
    </props>
  </properties>
</Request>