SORU
10 Kasım 2008, PAZARTESİ


IXmlSerializable uygulamak için doğru yolu?

Bir programcı IXmlSerializable hayata geçirmeye karar verdiğinde uygulanmasına ilişkin kurallar ve en iyi uygulamalar nelerdir? GetSchema() null iade etmesi gerektiğini duydum ve ReadXml dönmeden önce bir sonraki öğeye hareket etmeliyiz. Bu doğru mu? Ve WriteXml - nesne için bir kök öğesi yazmalı ya da kök zaten yazılı olduğu varsayılır? ne hakkında Nasıl çocuk nesneleri tedavi ve yazılmalıdır?

İşte ben şimdi ne var bir örnek. İyi tepkiler alıyorum olarak güncelleriz.

public class MyCalendar : IXmlSerializable
{
    private string _name;
    private bool _enabled;
    private Color _color;
    private List<MyEvent> _events = new List<MyEvent>();


    public XmlSchema GetSchema() { return null; }

    public void ReadXml(XmlReader reader)
    {
        if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyCalendar")
        {
            _name    = reader["Name"];
            _enabled = Boolean.Parse(reader["Enabled"]);
            _color   = Color.FromArgb(Int32.Parse(reader["Color"]));

            if (reader.ReadToDescendant("MyEvent"))
            {
                while (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyEvent")
                {
                    MyEvent evt = new MyEvent();
                    evt.ReadXml(reader);
                    _events.Add(evt);
                }
            }
            reader.Read();
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Name",    _name);
        writer.WriteAttributeString("Enabled", _enabled.ToString());
        writer.WriteAttributeString("Color",   _color.ToArgb().ToString());

        foreach (MyEvent evt in _events)
        {
            writer.WriteStartElement("MyEvent");
            evt.WriteXml(writer);
            writer.WriteEndElement();
        }
    }
}

public class MyEvent : IXmlSerializable
{
    private string _title;
    private DateTime _start;
    private DateTime _stop;


    public XmlSchema GetSchema() { return null; }

    public void ReadXml(XmlReader reader)
    {
        if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyEvent")
        {
            _title = reader["Title"];
            _start = DateTime.FromBinary(Int64.Parse(reader["Start"]));
            _stop  = DateTime.FromBinary(Int64.Parse(reader["Stop"]));
            reader.Read();
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Title", _title);
        writer.WriteAttributeString("Start", _start.ToBinary().ToString());
        writer.WriteAttributeString("Stop",  _stop.ToBinary().ToString());
    }
}

Örnek XML ilgili

<MyCalendar Name="Master Plan" Enabled="True" Color="-14069085">
    <MyEvent Title="Write Code" Start="-8589241828854775808" Stop="-8589241756854775808" />
    <MyEvent Title="???" Start="-8589241828854775808" Stop="-8589241756854775808" />
    <MyEvent Title="Profit!" Start="-8589247048854775808" Stop="-8589246976854775808" />
</MyCalendar>

CEVAP
11 Kasım 2008, Salı


, () Evet GetSchema should return null.

Ixmlserializable.Bu GetSchema Yöntemi yöntem ayrılmıştır ve kullanılmamalıdır kullanılır. Bu uygularken Ixmlserializable arabirimini gerekir dönüş (hiçbir Şey bir referans null Bu yöntem, Visual Basic), ve bunun yerine, eğer özel bir şema olduğunu belirterek, Eğer gerekli uygulayın XmlSchemaProviderAttribute için sınıf.

Okuma ve yazma için, nesne öğesi çoktan yazıldı, yazmak bir dış öğe eklemenize gerek yok. Örneğin, sadece iki öznitelikleri yazma okumaya başlayabilirsiniz.

write için:

WriteXml uygulama XML yazmak gerekir sağlamak nesne gösterimi. Bu çerçeve ve kapsayıcı bir eleman yazıyor onun ardından XML yazar pozisyonlar başlayın. Uygulamanız yazabilirsiniz içeriği, çocuk da dahil olmak üzere elemanları. Çerçeve sonra kapanır kapsayıcı öğe.

Ve read için:

ReadXml yöntemini sulandırmak gerekir nesne bilgileri kullanarak bu WriteXml metodu ile yazılmıştır.

Bu yöntem çağrıldığında, okuyucu en başında konumlandırılmış eleman bilgi için sarar senin yazın. Önce, sadece başlangıç o başlangıç gösterir etiketi seri hale getirilmiş bir nesne. Bu zaman yöntem döndürür, okumak gerekir, başından sonuna kadar,tüm element tüm içeriği de dahil olmak üzere. Aksine WriteXml yöntemi, çerçeve kapsayıcı öğesi işlemez otomatik olarak. Uygulamanız bunu yapmak gerekir. Bu gözlemlemek için başarısız konumlandırma kuralları kodu neden olabilir beklenmeyen çalışma zamanı özel durumlar oluşturmak veya bozuk veri.

Biraz karışık olduğunu kabul ediyorum, ama aşağı kaynar "Read() sarıcı sonu-öğe etiketi için bir iştir".

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michael Neal

    Michael Neal

    2 Mayıs 2009
  • Ordetta Price

    Ordetta Pric

    12 EYLÜL 2011
  • Tylerron

    Tylerron

    6 AĞUSTOS 2006