【发布时间】:2012-02-14 05:02:27
【问题描述】:
假设我必须在级别中序列化 Car 类的对象,例如内部和公共。 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 类非常简单,只有属性,便于维护和理解。
【问题讨论】:
-
编写自定义序列化方法是我所知道的更好的方法(实际上并不难)。您有自定义序列化要求,这适用于自定义序列化程序......您是否有特殊原因不想走这条路?
-
主要原因是我在框架环境中,序列化应该由框架完成,我只是将结果作为对象返回。
-
你能看到这个环境中的其他类正在做什么来解决这个问题吗?如果您要将它破解成碎片,不妨像其他人一样破解它:)
-
哈!我是第一个做“根据级别公开属性”的人。
-
我想说是时候更新序列化框架了,因为有新的需求:)
标签: c# serialization