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

标签 c# serialization

假设我必须按级别序列化类 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/

相关文章:

c# - asp.net 中的 PreLoad 和 Load 事件

c# - 无法抑制 FxCop 警告 CA1062

json - Jackson:有没有办法将 POJO 直接序列化为 treemodel?

java - 如何将派生属性添加到 Jackson 2 序列化类?

c# - 如何在遍历 Treeview 时设置位置

c# - 使用 XPath 查询从匹配的 XML 节点获取属性值

c# - 如何每天重置应用程序变量

类字段和序列化上的 Java 泛型更改

iPhone 序列号问题

.net - HttpWebRequest 不会序列化