DataContractSerializer не предназначен для управления выходом. Он предназначен для быстрого, неявного и простого атрибута класса.
Что вы хотите, это XmlSerializer. Это дает вам больший контроль над выходом XML.
Обратите внимание, что в моем примере ниже я указал много вещей, которые могли быть выведены из имен свойств, но только для того, чтобы дать вам понять, что вы можете переопределить их в атрибутах. На самом деле я думаю, что весь этот класс будет сериализоваться просто отлично, если бы все атрибуты были удалены, а некоторые KnownTypeAttributes были применены, но я не тестировал его. Я не знаю, даст ли это вам точный XML, который вы описали (он создаст корневой элемент выше Children), но, надеюсь, это приведет вас в правильном направлении.
Attributes That Control XML Serialization
[XmlRoot(Namespace="")]
public class MyClass {
[XmlArray("Children")]
[XmlArrayItem("ConcreteTypeA", typeof(ConcreteTypeA))]
[XmlArrayItem("ConcreteTypeB", typeof(ConcreteTypeB))]
public BaseType[] Children {
get;
set;
}
}
public class BaseType {
}
public class ConcreteTypeA : BaseType {
}
public class ConcreteTypeB : BaseType {
}
EDIT: Я просто проверял и производит что-то очень близкое к тому, что вы искали.
void Main()
{
var mc = new MyClass();
mc.Children = new BaseType[] {
new ConcreteTypeA(),
new ConcreteTypeB(),
new ConcreteTypeA(),
new ConcreteTypeB()
};
var serializer = new XmlSerializer(typeof(MyClass));
using (var str = new StringWriter()) {
serializer.Serialize(str, mc);
str.ToString().Dump();
}
}
... производит ... (бесполезное XMLNS удаляется из верхних)
<MyClass>
<Children>
<ConcreteTypeA />
<ConcreteTypeB />
<ConcreteTypeA />
<ConcreteTypeB />
</Children>
</MyClass>
вы должны дать пример кода, что вы хотите .. – Nix
он сделал, это не было отмечено должным образом , Я исправил его для него. – Josh