gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:52:36 25 4
gpt4 key购买 nike

在 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 文件。

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

解决方案:我找到了解决方案。我可以添加一个始终返回 false 的 ShouldSerialize 属性,详情请见 this MSDN documentation

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

最佳答案

这是 Manoj 概述的解决方案:

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

例子:

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 时,这种隐藏才有效,但如果您使用此代码编辑实际项目,则无效。

关于c# - 在 xml 序列化期间忽略属性,但在反序列化期间不忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18242320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com