Как создать классы с помощью инструмента из XML для сериализации в Silverlight? - PullRequest
2 голосов
/ 29 октября 2011

Каков наилучший способ создания классов из сложного XML для десериализации в Silverlight? В .NET вы можете использовать xsd.exe из Visual Studio.

ты получаешь что-то вроде этого

using System.Xml.Serialization;

 /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
// this is unknown in SILVERLIGHT [System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
//this is unknown in SILVERLIGHT [System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
 [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]

public partial class Attest {

private AttestBet[] betField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Bet")]
public AttestBet[] Bet {
    get {
        return this.betField;
    }
    set {
        this.betField = value;
    }
}
}

но когда я копирую вставить в приложение Silverlight, я получаю сообщение об ошибке

// this is unknown in SILVERLIGHT [System.SerializableAttribute()]
//this is unknown in SILVERLIGHT [System.ComponentModel.DesignerCategoryAttribute("code")]

когда я комментирую это и использую код без этих двух строк, это вроде работает на простом примере. Есть ли лучший инструмент для создания классов для использования в Silverlight?

1 Ответ

0 голосов
/ 25 марта 2012

Вы правы, никто, на самом деле, никто не делает, так что проще просто разобрать файл XML.Но вы можете использовать приведенный ниже код, если предположим, что вы хотите связать управление напрямую с файлом XML и хотите иметь хорошую сериализацию / desirealize.Обычно я использую этот метод только при работе с большими данными, которые WCF не может обработать (т. Е. 50-600 МБ на вызов).

Создайте новый класс с именем XmlNodeItem.Класс представляет отдельный узел из файла XML

public class XmlNodeItem
{
    [XmlAttribute( AttributeName = "Bet" )]
    public string Bet
    {
        get;
        set;
    }
    [XmlAttribute( AttributeName = "SomeOtherStuff" )]
    public string SomeOtherStuff
    {
        get;
        set;
    }
}

. Затем создайте еще один класс с именем XmlNodeItemList, который наследуется от ObservableCollection объекта XmlNodeItem.

[XmlRoot( ElementName = "Items" )]
public class XmlNodeItemList : ObservableCollection<XmlNodeItem>
{
    public void AddRange( IEnumerable<XmlNodeItem> range )
    {
        foreach ( XmlNodeItem node in range )
        {
            this.Add( node );
        }
    }
}

Затем получите ваши данные

public DataClass: XmlNodeItemList 
{

var data =  AddRange( RetrieveData( File.Open( value, FileMode.Open ) ) );


 //Retrieve Data method

public XmlNodeItemList RetrieveData( Stream xmlStream )
    {
        XmlSerializer serializer = new XmlSerializer( typeof( XmlNodeItemList ) );
        StreamReader reader = new StreamReader( xmlStream );
        XmlNodeItemList list = ( XmlNodeItemList )serializer.Deserialize( reader );
        return list;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...