2013-09-03 2 views
0

Поэтому у меня есть XML, который выглядит следующим образом:Невозможно? Как десериализовать это с помощью DataContractSerializer?

<a> 
    <b c="1" ></b> 
    <b c="2" ></b> 
    <b c="3" ></b> 
    <b c="4" ></b> 
</a> 

Я десериализация это на WP7, используя DataContractSerializerdo это.

Я сталкиваюсь с некоторыми мнениями о том, что это невозможно сделать без каких-либо трюков, таких как включение этого XML в дополнительные теги, чтобы нажать < a> вниз от корневого уровня.
Это правда?

По вашему запросу я добавил некоторый код

Классы:

[KnownType(typeof(B))] 
[DataContract(Namespace = "")] 
public class A:List<B> 
{ 
    [DataMember] 
    public List<B> B 
    { 
     List<B> _b = new List<B>(); 
     get { return _b; } 
     set { _b = value; } 
    } 
} 

[DataContract(Namespace = "")] 
public class B 
{ 
    [DataMember] 
    public string c = "foo"; 
} 

десериализация:

var serializer = new DataContractSerializer(typeof(A)); 
var o = serializer.ReadObject(SomeResponseStream); 

И многие, многие другие вариации этого.
Кстати - такого расположения классов будет сериализовать в XML следующим образом:

<a> 
    <b> 
     <b c="1" ></b> 
     <b c="2" ></b> 
     <b c="3" ></b> 
     <b c="4" ></b> 
    </b> 
</a> 

Уведомление дополнительный нежелательный уровень < б>

+3

Вы не можете использовать атрибуты с 'DataContractSerializer': http://stackoverflow.com/questions/591907/how-can-you-control-net-datacontract-serialization-so-it-uses-xml -attributes-in Вместо этого следует использовать LINQ to XML. – MarcinJuraszek

+0

@ I4V Я думаю, что это невозможно в Windows Phone 7. –

+0

@HighCore: доступно: http://stackoverflow.com/questions/5119312/windows-phone-7-and-system-xml-linq-library – NotMe

ответ

1

Как сказано в комментарии, Linq2Xml может быть лучшим способом go

string xml = @" 
<a> 
    <b> 
     <b c=""1"" ></b> 
     <b c=""2"" ></b> 
     <b c=""3"" ></b> 
     <b c=""4"" ></b> 
    </b> 
</a>"; 

var bs = XDocument.Parse(xml) 
        .Root 
        .Element("b") 
        .Elements("b") 
        .Select(b => new B { c = b.Attribute("c").Value }) 
        .ToList(); 

.

public class B 
{ 
    public string c = "foo"; 
} 
Смежные вопросы