C#将简单对象序列化为xml。没有命名空间没有空值

C#将简单对象序列化为xml。没有命名空间没有空值,c#,xml,serialization,null,xml-namespaces,C#,Xml,Serialization,Null,Xml Namespaces,我得到了以下代码: public class Alarm:IDisposable { MemoryStream _tmp; readonly XmlDocument _doc; private readonly XmlSerializerNamespaces _ns; private readonly XmlSerializer _x = new XmlSerializer(typeof(Alarm)); public int? ID { get; se

我得到了以下代码:

public class Alarm:IDisposable
{
    MemoryStream _tmp;
    readonly XmlDocument _doc;
    private readonly XmlSerializerNamespaces _ns;
    private readonly XmlSerializer _x = new  XmlSerializer(typeof(Alarm));
    public int? ID { get; set; }
    public string SourceSystem { get; set; }
    public string SensorName { get; set; }
    public string ModelName { get; set; }
    public int? Severity { get; set; }
    public int? Duration { get; set; }
    public bool? Status { get; set; }
    public DateTime? StartTime { get; set; }
    public DateTime? EndTime { get; set; }

    public Alarm()
    {
        _tmp = new MemoryStream();
        _doc = new XmlDocument();
        _ns = new XmlSerializerNamespaces();
        _ns.Add("", "");
    }
    public string OuterXml()
    {

        //Add an empty namespace and empty value
        _x.Serialize(_tmp, this, _ns);
        _tmp.Position = 0;
        _doc.Load(_tmp);
        return _doc.OuterXml;
    }


    public void Dispose()
    {
        if (_tmp!=null)
        {
            _tmp.Close();
            _tmp = null;
        }

    }
}
<Alarm><ID>1</ID><SourceSystem>HMer</SourceSystem><SensorName>4</SensorName>
<Duration>500</Duration><Status>true</Status>
<StartTime>2011-07-19T12:29:51.171875+03:00</StartTime></Alarm>
我作为输出获取


1毫米
4.
千真万确
2011-07-19T12:29:51.171875+03:00
我想得到:

public class Alarm:IDisposable
{
    MemoryStream _tmp;
    readonly XmlDocument _doc;
    private readonly XmlSerializerNamespaces _ns;
    private readonly XmlSerializer _x = new  XmlSerializer(typeof(Alarm));
    public int? ID { get; set; }
    public string SourceSystem { get; set; }
    public string SensorName { get; set; }
    public string ModelName { get; set; }
    public int? Severity { get; set; }
    public int? Duration { get; set; }
    public bool? Status { get; set; }
    public DateTime? StartTime { get; set; }
    public DateTime? EndTime { get; set; }

    public Alarm()
    {
        _tmp = new MemoryStream();
        _doc = new XmlDocument();
        _ns = new XmlSerializerNamespaces();
        _ns.Add("", "");
    }
    public string OuterXml()
    {

        //Add an empty namespace and empty value
        _x.Serialize(_tmp, this, _ns);
        _tmp.Position = 0;
        _doc.Load(_tmp);
        return _doc.OuterXml;
    }


    public void Dispose()
    {
        if (_tmp!=null)
        {
            _tmp.Close();
            _tmp = null;
        }

    }
}
<Alarm><ID>1</ID><SourceSystem>HMer</SourceSystem><SensorName>4</SensorName>
<Duration>500</Duration><Status>true</Status>
<StartTime>2011-07-19T12:29:51.171875+03:00</StartTime></Alarm>
1HMer4
千真万确
2011-07-19T12:29:51.171875+03:00
表示没有xmlns内容,没有值为null的标记。


请协助meh将以下属性添加到可为空的字段中:

[XmlIgnore]
public bool EndTimeSpecified { get { return EndTime.HasValue; } }
这让XmlSerializer(对于可为null的字段有点愚蠢)意识到没有指定EndTime,因此,该字段不需要序列化

以下是:

另一个选项是使用特殊模式创建XmlSerializer识别的布尔字段,并将XmlIgnoreAttribute应用于该字段。该模式以propertyNameSpecified的形式创建。例如,如果有一个名为“MyFirstName”的字段,您还将创建一个名为“MyFirstNameSpecified”的字段指示XmlSerializer是否生成名为“MyFirstName”的XML元素

下面是一个相关的SO问题,提供了更多细节和解释:

关于删除XML处理指令(即
部分),还有一个问题:


将以下属性添加到可为空的字段中:

[XmlIgnore]
public bool EndTimeSpecified { get { return EndTime.HasValue; } }
这让XmlSerializer(对于可为null的字段有点愚蠢)意识到没有指定EndTime,因此,该字段不需要序列化

以下是:

另一个选项是使用特殊模式创建XmlSerializer识别的布尔字段,并将XmlIgnoreAttribute应用于该字段。模式以propertyNameSpecified的形式创建。例如,如果有一个名为“MyFirstName”的字段,您还将创建一个名为“MyFirstNameSpecified”的字段,该字段指示XmlSerializer是否生成名为“MyFirstName”的XML元素

下面是一个相关的SO问题,提供了更多细节和解释:

关于删除XML处理指令(即
部分),还有一个问题:


我不清楚如何在不经过地狱的情况下移除,请详细说明\@Nahum:有一个简短的代码示例。这有帮助吗?谢谢你的回答,它也帮助了我。我不清楚如何在不经过地狱的情况下移除,请详细说明\@Nahum:有一个简短的代码示例。那有帮助吗?谢谢你的回答,它也帮助了我。