Как использовать DataContractSerializer для создания XML с именами тегов, которые соответствуют моим известным типам - PullRequest
3 голосов
/ 26 мая 2010

У меня есть следующий контракт данных:

[CollectionDataContract(Name="MyStuff")] 
public class MyStuff : Collection<object> {}

[DataContract(Name = "Type1")]
[KnownType(typeof(Type1))]
public class Type1
{
    [DataMember(Name = "memberId")] public int Id { get; set; }
}

[DataContract(Name = "Type2")]
[KnownType(typeof(Type2))]
public class Type2
{
    [DataMember(Name = "memberId")] public int Id { get; set; }
}

который я сериализирую в xml следующим образом:

MyStuff pm = new MyStuff();

Type1 t1 = new Type1 { Id = 111 };
Type2 t2 = new Type2 { Id = 222 };

pm.Add(t1);
pm.Add(t2);

string xml;

StringBuilder serialXML = new StringBuilder();
DataContractSerializer dcSerializer = new DataContractSerializer(typeof(MyStuff));
using (XmlWriter xWriter = XmlWriter.Create(serialXML))
{
    dcSerializer.WriteObject(xWriter, pm);
    xWriter.Flush();
    xml = serialXML.ToString();
}

Результирующая строка XML выглядит следующим образом:

<?xml version="1.0" encoding="utf-16"?>
<MyStuff xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/">
    <anyType i:type="Type1">
        <memberId>111</memberId>
    </anyType>
    <anyType i:type="Type2">
        <memberId>222</memberId>
    </anyType>
</MyStuff>

Кто-нибудь знает, как заставить его использовать вместо этого имя моих известных типов вместо anyType в теге xml?

Я хочу, чтобы это выглядело так:

<?xml version="1.0" encoding="utf-16"?>
<MyStuff xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://schemas.datacontract.org/2004/07/">
    <Type1>
        <memberId>111</memberId>
    </Type1>
    <Type2>
        <memberId>222</memberId>
    </Type2>
</MyStuff>

1 Ответ

1 голос
/ 26 мая 2010

С какой стати ты это делаешь ??

[DataContract(Name = "Type1")]
[KnownType(typeof(Type1))]
public class Type1
{
}

Я не думаю, что здесь необходим атрибут KnownType - он понадобится в случаях полиморфизма: если у вас есть метод, который возвращает BaseType и может вернуть на его место производный тип Type1 : BaseType.

Если вы вернете Type1 и у вас действительно будет только Type1 в качестве типа, этот атрибут knownType является излишним.

Вторая проблема заключается в следующем:

public class MyStuff : Collection<object> {

Если у вас есть коллекция object - это коллекция потенциально чего-либо вообще - поэтому сериализатор будет использовать xs:anyType для представления этого.

Разве вы не можете ввести тип базового класса, сделать свою коллекцию коллекцией этого базового типа и получить два ваших отдельных типа из этого базового класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...