2012-10-12 3 views
4

Возможные Дублировать:
How to XML deserialize an object of Unknown Type?Deserialise для анонимного типа

Я только начал играть с сериализации и десериализации.

У меня есть модель типа Person, имеющая всего 2 свойства (имя и возраст), я могу сериализоваться в XML. Когда дело доходит до десериализа, насколько я знаю, я должен сказать компилятору, что это тип Person. С миром родового Т это кажется контрпродуктивным. Я бы подумал, что могу установить объект как объект InMemoryOnly (если вы его себе представляете), где объект создается во время выполнения, как и его параметры/поля/свойства и т. Д., Все они основаны на XML. Возможно, как анонимный тип; Я понимаю, что компилятор C# должен будет игнорировать это во время разработки и что мы потеряем intellisense, но поскольку все объекты передаются в память каким-либо образом, я не могу понять, почему это произойдет во время выполнения. Или, возможно, это было бы возможно с Reflection?

В любом случае, это то, что я пытаюсь сделать, десериализую из XML в общий объект. Возможно ли это с C#?

EDIT Только что нашел обман, так что теперь вопрос в том, почему C# (.NET) не делает этого? Я знаю, что ответ, вероятно, «потому что это не так», но мой вопрос МОЖЕТ быть возможным или будет больше проблем, чем это стоит для программиста?

Причина этого, насколько я знаю, для достижения этого означает, что сериализация и де-сериализация должны знать тип (в данном случае Person). Таким образом, если сериализ и десериализация происходят по сравнению с WCF (где сериализация и сериализация происходят в разных сборках), объект Person должен быть дублирован (и это противоречит принципу DRY)

+2

Что могло бы быть преимуществом этого? Зачем пытаться сделать вещи бесполезно сложными и подразумеваемыми? По моему мнению и опыту, всегда лучше, чтобы ваш код явно выражал то, что он должен делать; это более читаемо, понятно и, следовательно, поддерживается. –

+1

Ошибка больше не актуальна. С новым ключевым словом dynamic в .NET 4 это может быть достигнуто. Однако как бы вы использовали такой тип? Поскольку он был определен в XML, вы ничего не знаете об этом и не можете его использовать, не так ли? –

+1

Итак, вы хотите десериализовать неизвестный тип или тот, который не будет известен до выполнения? –

ответ

3

Образец WCF не имеет веской причины сделать это.
Вы просто могли бы - и можете! - поместите класс Person в сборку, которая используется как сервером, так и клиентом. Вот как я это делаю при использовании WCF.
Если вы не хотите этого делать, Visual Studio предлагает автоматически генерировать типы, используемые в службе, когда вы добавляете ссылку на службу.
В обоих случаях вы должны обновить класс Person только в одном месте.

Смежные вопросы