在 xml 序列化期间忽略属性,但在反序列化期间不忽略属性

2024-04-16

在 C# 中,如何使 XmlSerializer 在序列化期间忽略属性,但在反序列化期间不忽略? (或者我该如何对 Json.net 做同样的事情?)

要防止属性被序列化,您可以添加XmlIgnore属性:

[XmlIgnore]
public int FooBar {get;set;}

这将导致<FooBar>序列化期间要省略的标签。

然而,这也意味着<FooBar>反序列化期间标签将被忽略。

就我而言,我在请求中接受用户发出的一系列项目,并且对于每个项目,如果用户想要添加、修改或删除该项目,则可以指定一个操作属性。我想对 GET 列表调用使用相同的模型对象,并且不想返回此操作属性。我预计这将是一个非常常见的情况。

另一个用例: 假设你有一个圆形物体

public class Circle
{
    public double Radius { get; set; }
}

然后修改它以添加直径属性

public class Circle2
{
    public double Diameter { get; set; }
    public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }
}

您可能只想序列化直径,但仍然能够以仅包含半径的旧格式反序列化 xml 文件。

我做了我的研究,但没有发现任何东西,因此这个问题

Solution: 我已经找到解决办法了。我可以添加一个 ShouldSerialize 属性,该属性始终返回 false,详细信息位于这个 MSDN 文档 https://learn.microsoft.com/en-us/dotnet/framework/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods

(如果重新打开此问题,则可以添加此解决方案作为实际答案)


这是 Manoj 概述的解决方案:

如果您想禁止特定属性的序列化Foo,但仍然能够反序列化它,你可以添加一个方法public bool ShouldSerializeFoo()总是返回 false。

Example:

public class Circle2
{
    public double Diameter { get; set; }
    public double Radius { get { return Diameter / 2; } set { Diameter = value*2; } }

    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public bool ShouldSerializeRadius() {return false;}
}

这将导致 Radius 不被序列化,但仍然允许它被反序列化。

此方法必须是公共的,XMLSerializer 才能找到它,因此为了避免污染命名空间,您可以添加EditorBrowsable属性以对 IDE 隐藏它。不幸的是,只有当程序集在当前项目中被引用为 DLL 时,这种隐藏才有效,但如果您使用此代码编辑实际项目,则这种隐藏无效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 xml 序列化期间忽略属性,但在反序列化期间不忽略属性 的相关文章

随机推荐