Просто чтобы пояснить ответ Андрея и поделиться своим опытом, я только что столкнулся с проблемой, которую окончательно решил с помощью CollectionDataContract. По сути, для взаимодействия с конкретной системой я хотел иметь возможность отправлять и получать xml формата:
<SomeMessageList>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
//any number of repeated <Message> here
</SomeMessageList>
Однако, если я использовал массив или объект List, корневой тег всегда назывался ArrayOfMessage. И если бы я создал класс, который содержал массив объектов Message (скажем, с именем MsgList), то WCF добавил бы это в качестве дополнительного тега в миксе, от которого я не мог найти способ избавиться. Так это выглядело бы так:
<SomeMessageList>
<MsgList>
<Message>
<ID>blah</ID>
<data1>blah</data1>
<data2>etc.etc.</data2>
</Message>
//any number of repeated <Message> here
</MsgList>
</SomeMessageList>
Итак, CollectionDataContract просто дал мне простой способ управления именем корневого элемента списка.