gpt4 book ai didi

c# - 决定哪些属性在运行时被序列化

转载 作者:太空狗 更新时间:2023-10-29 19:41:33 25 4
gpt4 key购买 nike

假设我必须按级别序列化类 Car 的对象,例如内部和公共(public)。公共(public)级别的某些属性不应序列化,因为它们是内部的。

目前我能想到的“最简单”的方法是使用继承:

class CarPublic {
public int PropX {get;set}
}

class CarInternal: CarPublic {
public string PropY {get;set}
}

那我可以

object ToSerialize() {
CarInternal car = GetCar();
if( level == Level.Public ) {
return car as CarPublic;
} else {
return car;
}
}

ToSerialize() 的结果由框架获取(我没有控制)并序列化为 JSON 或 XML。

为简单起见,我省略了 XML 序列化属性。

这感觉像是黑客攻击,而黑客攻击只能带您到此为止。有没有更好的方法(方法?)来实现这一点?

我想现在已经很清楚了,但我想避免为 JSON 和 XML 编写自己的序列化方法。

提前致谢泰美克

==编辑

澄清一下,我希望能够序列化多个级别:

class Car0 {
public int PropA {get;set}
}

class Car1: Car0 {
public string PropB {get;set}
}

class Car2: Car1 {
public int PropC {get;set}
}

class Car3: Car2 {
public string PropD {get;set}
}

object ToSerialize( Level level ) {
Car3 car = GetCar();
switch( level ) {
case Level.Zero: return car as Car0;
case Level.One: return car as Car1;
case Level.Two: return car as Car3;
case Level.Three: return car as Car4;
}
return null;
}

== 选择的方法

我将 Marc Gravell 的回答标记为答案,因为它提供了有关 C# 及其“标准”组件如何支持我所要求内容的一般信息。

但是我认为解决我的问题的最佳方法是使用代理类,如上所示,使用如下所示的方法在此多级模式中对类进行序列化。

public interface ICar {
Car0 As0();
Car1 As1();
Car2 As2();
Car3 As3();
...
}

这使得 Car0..3 类非常简单,只有属性,便于维护和理解。

最佳答案

这在很大程度上取决于您使用的序列化框架。你提到了 xml 和 json - 好吧,首先要注意的是你可以装饰:

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

[ScriptIgnore]
public int PropX {get;set;}

XmlSerializerJavascriptSerializer 将响应。如果您需要根据每个实例做出决定,可以使用 ShouldSerialize**Specified 模式:

public bool ShouldSerializePropX() {
// return true to serialize, false to omit
}

上面是一个基于名称的模式,被 XmlSerializer 和其他人使用;它有一个双胞胎:

[XmlIgnore, Browsable(false)]
public bool PropXSpecified {
get { /* return true to serialize, false to omit */ }
set { /* can just drop this value - don't need to assign */ }
}

您无需对它们进行任何操作 - 它们会自动工作。

不同的序列化器允许不同的模式。

此外,有时您可以在运行时添加诸如 [XmlIgnore] 之类的内容 - 例如通过 XmlAttributeOverrides 或任何给定序列化程序的等效项。

关于c# - 决定哪些属性在运行时被序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9271962/

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