2010-02-08 2 views
0

Я пытаюсь преобразовать «коллекцию коллекций» в улучшенный xml. В принципе, я хочу солгать потребителю услуг и сделать его похожим на реальный объект.Сгладить коллекцию во время сериализации

Это то, что WCF автоматически создает

<EntityPropertyCollection xmlns="http://schemas.datacontract.org/2004/07/CustomSerializer" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<EntityProperty> 
    <Name>Test</Name> 
    <Value i:nil="true"/> 
</EntityProperty> 
<EntityProperty> 
    <Name>Test2</Name> 
    <Value i:type="EntityPropertyCollection"> 
    <EntityProperty> 
    <Name>Nested1</Name> 
    <Value i:nil="true"/> 
    </EntityProperty> 
    <EntityProperty> 
    <Name>Nested2</Name> 
    <Value i:nil="true"/> 
    </EntityProperty> 
    </Value> 
</EntityProperty> 
</EntityPropertyCollection> 

Это то, что я хотел бы достичь

<Something> 
<Test i:nil="true"/> 
<Test2 i:type="Something"> 
    <Nested1 i:nil="true"/> 
    <Nested2 i:nil="true"/> 
</Test2> 
</Something> 

Пользовательская сериалайзер для определенного типа (EntityProperyCollection) было бы хорошо, но другие сообщения указывают, что это не вариант.

Я рассмотрел суррогаты с данными контрактов. Я думаю, что я мог бы создать пользовательский тип и позволить DataContractSerializer сериализовать сгенерированный тип. Но я надеюсь, что есть более простое решение.

ответ

0

Вы можете реализовать IXmlSerializable на возвращаемом объекте и выполнить сериализацию вручную или просто вернуть поток и использовать XmlWriter для создания именно того XML, который вы хотите.

+0

Я пробовал это. Как вы сказали, он работает для Xml. Однако я не мог найти эквивалент JSON для служб REST. DataContractSerializer запечатан, к сожалению. Я думаю, что вернусь к суррогату; сгенерируйте тип и пусть сериализаторы работают так, как обычно. Спасибо за помощь –

+0

Зайдите в стартовый комплект WCF REST. В нем есть библиотека под названием Microsoft.Http и Microsoft.Http.Extensions. В нем есть некоторые сериализаторы Json и десериализаторы. Вы должны использовать их для создания потока JSON. Эти классы предназначены для использования на клиенте, но они также работают на сервере. –

+0

Спасибо за предложение. Сегодня я не мог работать над этим. Когда я вернусь к нему, я дам вам знать, как это происходит. –

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