Отказ от ответственности: Я работаю на TypeScript, и с тех пор, как я работал на C/C++/Java, прошло слишком много времени;)
Моя идея в TS была бы такой:
Код: Выделить всё
interface ParentData {
foo: string;
}
class Parent {
foo: string;
public getSerializableData(): ParentData {
// Parent only knows about foo, serializes it:
return { foo: this.foo };
}
}
interface ChildData extends ParentData {
foo: string;
}
class Child extends Parent {
bar: string;
public getSerializableData(): ParentData {
// child doesn't need to know how parent's data is serialized,
// so just "extends" the data from the parent, with its own:
const data = super.getSerializableData() as ChildData;
data.foo = this.foo;
return foo;
// or this version if you prefer maintaining types without casting:
const data = super.getSerializableData();
return {
...data,
foo: this.foo,
};
}
}
const instance: Parent = new Child();
const serialized = JSON.stringify(instance.getSerializableData());
Код: Выделить всё
// omitting the Parent class...
public class Child : Parent
{
public class Data : Parent.Data
{
string bar;
}
private string bar;
public override Parent.Data GetSerializableData()
{
var data = base.GetSerializableData();
return new Child.Data() {
foo = data.foo,
bar = data.bar,
};
}
}
И в любом случае я чувствую, что он сломается из-за управления приведением типов и того, что он является другим типом объекта, даже если Я использую настройку TypeNameHandling.Auto
Код: Выделить всё
using Newtonsoft.Json;
JsonSerializerSettings settings = new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.Auto,
};
string data = JsonConvert.SerializeObject(
new Child().GetSerializableData(),
settings
);
Подробнее здесь: https://stackoverflow.com/questions/787 ... ld-classes