В этом подходе есть пара проблем; да, в стандартных буферах протокола любые метаданные Type
немного капризны, поскольку они не очень совместимы, но я немного проигрываю с этим в v2 на основе согласия - что позволяет отправлять object
и т. д. до тех пор, пока внутри все еще знает, что вы имеете в виду.
Это, однако, обойдется дорого для работы по ячейкам, даже с встроенными оптимизациями (например, мета одного типа отправляется только один раз, например).
IMO, однако, гораздо лучшим вариантом будет ограничить себя списком известных типов, которые все известны заранее. Если вы можете сделать , то есть несколько интересных приемов с наследованием, которые довольно эффективны и разумно подходят для этого сценария. Но по сути у вас будет что-то вроде:
[ProtoContract]
[ProtoInclude(4, typeof(Column<int>))] // etc
abstract class Column {
[ProtoMember(1)]
public string Name {get;private set;}
public abstract object Value {get;private set;}
}
[ProtoContract]
class Column<T> : Column {
[ProtoMember(1)]
public T TypedValue { get;private set;}
override Value {...shim to TypedValue...}
}
// etc
(псевдокод, неполный)
Я бы с радостью провел вас по многим вопросам, но вы также можете посмотреть эту запись в блоге , чтобы узнать, используете ли вы DataTable
(насколько мне это не нравится для доступа к данным) может сэкономить немного усилий здесь.