如何使用序列化程序使 XML 标签强制使用自关闭标签?

How to make an XML tag mandatory with a self-closing tag, using the serialiser?

我正在开发 C# 程序,我正在尝试序列化 XML。

我有以下标签:

using System.Xml.Serialization;
...
[XmlElement("MV")]
public MultiVerse MultiVerse { get; set; }

当我不填写这个值时,标签 <MV> 不存在,但我想得到一个标签 <MV/> 在这种情况下:

目前我有 <HM><ID>Some_ID</ID></HM>.
我想要 <HM><ID>Some_ID</ID><MV/></HM>.

我已经尝试在该行前面加上 [Required],但没有用,我认为填写 IsNullable 属性是个好方法。

Edit1,在网上查了一下
网上有很多关于修改XmlWriter的建议,但在我的项目中,整个序列化是这样完成的:

public override string ToString()
{
    ...
    using (var stream = new StringWriter())
    using (var writer = XmlWriter.Create(stream, settings))
    {
        var serializer = new XmlSerializer(base.GetType());
        serializer.Serialize(writer, this, ns);
        return stream.ToString();
    }
    ...
}

如您所见,这太笼统了,我不想在这里做任何修改,因此我正在寻找一种自定义 [XmlElement] 指令的方法。

Edit2:XmlWriter 设置:
XmlWriter settings 如下所示:

// Remove Declaration
var settings = new XmlWriterSettings
{
    Indent = false,
    OmitXmlDeclaration = true,
    NewLineHandling = NewLineHandling.None,
    NewLineOnAttributes = false,
};

有人有想法吗?

提前致谢

https://docs.microsoft.com/en-us/dotnet/api/system.xml.serialization.xmlelementattribute.isnullable?view=net-6.0所以例如

[XmlElement("MV", IsNullable=true)]
public MultiVerse MultiVerse { get; set; }

会给你一个空值,序列化为 <MV xsi:nil="true" /> (或者可能 <MV xsi:nil="true"></MV> 确保短标记符号不是标准作者给你控制的东西,但我的经验是.NET 通常将它用于空元素,因此您可能很幸运,您想要的序列化格式是默认的 .NET 输出格式)。

这是我目前解决问题的方式(别笑):

public override string ToString()
{
    string temp = base.ToString();
    temp = temp.Replace(" p2:nil=\"true\"", "");
    temp = temp.Replace(" xmlns:p2=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
    temp = temp.Replace("MV />", "MV/>");
    return temp;
}

这太可笑了!有人有更好的解决方案吗?

谢谢