Конференция ".Net" » Сериализация коллекции в XML формат
 
  • Skier © (18.12.07 14:05) [0]
    есть компонент :

    public class NORSqlProcedureContainer : Component, ISerializable
       {
           public NORSqlProcedureContainer()
           {
               items = new NORSqlProcedureCollection();                        
           }


           public NORSqlProcedureContainer(IContainer container)
               : this()
           {
               container.Add(this);
           }

           
           public NORSqlProcedure GetProcedure(string name)
           {
               if (Utils.IsNotEmpty(name))
               {
                   int index = items.IndexOf(name);
                   if (index == -1) { return null; }

                   else { return items[index]; }
               }
               else { return null; }
           }
           
           private NORSqlProcedureCollection items;

           public NORSqlProcedureCollection Items
           {
               get { return items; }

               set { items = value; }
           }                
       }



    Хотелось бы чтобы свойство Items серализовалось средой не в бинарный формат, а в XML. Подскажите, плиз, как это сделать?
  • Skier © (18.12.07 14:07) [1]
    пытался регистрировать сериализатор для св-ва Items, так :
    [DesignerSerializer(typeof(NORSqlProcedureContainerSerializer), typeof(XmlSerializer))]        

    не помогло...что не так?
  • clickmaker © (18.12.07 15:01) [2]
    ISerializable.GetObjectData нужно реализовать?
  • Skier © (18.12.07 15:18) [3]
    >clickmaker ©   (18.12.07 15:01) [2]
    И там руками писать с XML ?
  • clickmaker © (18.12.07 15:31) [4]

    > [3] Skier ©   (18.12.07 15:18)

    а NORSqlProcedureCollection наследуется от ICollection?

    вот что в MSDN:

    Items That Can Be Serialized
    The following items can be serialized using the XmLSerializer class:

    Public read/write properties and fields of public classes
    Classes that implement ICollection or IEnumerable

    Note  
    Only collections are serialized, not public properties.

    XmlElement objects
    XmlNode objects
    DataSet objects
  • Skier © (18.12.07 15:49) [5]

    > а NORSqlProcedureCollection наследуется от ICollection?

    Угу.
  • b z (18.12.07 16:13) [6]
    IXmlSerializable
  • Skier © (18.12.07 16:26) [7]
    Интересно.
    и что писать в
    WriteXml (XmlWriter writer)
    {
     //???    
    }

    ?
  • b z (18.12.07 16:27) [8]
    А вообще для чего это надо? если просто в файл, то должно хватить и просто [Serializable] (кстати его у вас нет?) на типе, а если в соап или ..., то см. выше.
  • b z (18.12.07 16:30) [9]

    > Skier ©   (18.12.07 16:26) [7]

    что то типа того:
    writer.WriteStartElement(this.EntityName, "urn:blablabla");
    ((IXmlSerializable)this.realTable).WriteXml(writer);
    writer.WriteEndElement();
  • Skier © (18.12.07 16:32) [10]
    >b z   (18.12.07 16:27) [8]


    > кстати его у вас нет?)

    Есть.


    > А вообще для чего это надо?

    Чтобы можно было править ресурс руками в случае неожиданного краха.
  • Skier © (18.12.07 16:34) [11]
    а что у тебя делает строка ((IXmlSerializable)this.realTable).WriteXml(writer); ?
  • b z (18.12.07 16:40) [12]
    извините, надо уходить, вот налабал простенький пример для файлика
           [Serializable]
           public class A
           {
               private List<string> _col;
               public List<string> col
               {
                   get
                   {
                       if (this._col == null)
                           this._col = new List<string>();
                       return this._col;
                   }

               }
           }

           private void button1_Click_1(object sender, EventArgs e)
           {
               A a = new A();
               a.col.Add("123");

               XmlSerializer serializer = new XmlSerializer(typeof(A));

               Stream writer = new FileStream("d:\\1.xml", FileMode.Create);
               serializer.Serialize(writer, a);
               writer.Close();
           }


    может вам подойдет


    > а что у тебя делает строка ((IXmlSerializable)this.realTable).
    > WriteXml(writer);

    там сериализация DataTable, это я выдрал из реального проекта, можете рефлектором посмотреть ее реализацию, и по аналогии, правда там немного навернуто, еще и схема учавствует ..
  • Skier © (18.12.07 16:48) [13]
    спасибо конечно,
    но меня не интересует сериализация "по кнопке", меня интересует
    взаимодействие моего сериализатора свойства и VS
  • b z (18.12.07 18:40) [14]
    мда. не заметил слово "средой"
    тогда, на сколько я понимаю, надо смотреть в сторону DesignerSerializer и IDesignerSerializationManager, но могу и ошибатсья
  • Канадец (19.12.07 01:37) [15]

    > пытался регистрировать сериализатор для св-ва Items, так
    > :
    > [DesignerSerializer(typeof(NORSqlProcedureContainerSerializer),
    >  typeof(XmlSerializer))]        
    >
    > не помогло...что не так?


    Не так то, что второй параметр должен быть CodeDomSerializer. Он единственный, на сколько я знаю, кто на данный момент поддерживается средой.

    Правильный подход, как уже заметили, ISerializable.
  • Skier © (19.12.07 10:06) [16]
    >Канадец   (19.12.07 01:37) [15]

    > Он единственный, на сколько я знаю, кто на данный момент
    > поддерживается средой.

    К сожалению, я тоже пришёл к такому же выводу.
    Бум работать (извращаться) через CodeDomSerializer

    Всем спасибо!
  • b z (19.12.07 10:55) [17]

    > Skier ©   (19.12.07 10:06) [16]

    Почему извращаться? Тут просто работает коде генерация, отсюда и все вытекающее.
    В принципе можно наверное посмотреть на локализацию. Вы тоже можете сделать свое свойство как [Localizable(true)], тогда оно для локализированных форм попадет в ресурсы, но это некрасиво и надо пробовать для сложных объектов, но на худой конец, когда много писать неохота :)
    По принципу локализации вы можете свой сериализатор унаследовать от CodeDomSerializer и в методах сделать свою сериализацию.

    И CodeDomSerializer не единственный, тут зависит скорее от самих дизайнеров. Другое дело, что предок у них CodeDomSerializerBase. Для редактора веб форм сериализатор уже совсем другой. Думаю, что для редактора xaml, он может отличаться, хотя и там может только наследник.

    А ISerializable тут совсем не причем, кто будет дергать этот интерфейс, непонятно.
  • Канадец (19.12.07 17:32) [18]

    > И CodeDomSerializer не единственный.....


    Примерчик плиз. Примерчик класса который можно "подсунуть" вторым параметром в Skier ©   (18.12.07 14:07) [1] и получить работающий код.


    > А ISerializable тут совсем не причем, кто будет дергать
    > этот интерфейс, непонятно.


    Вот каким образом работает CodeDomSerializer:
       * Primitives, such as strings, integers, and floating point values.
       * Any object implementing System.Collections.IList including arrays.
       * Any object implementing System.ComponentModel.IComponent.
       * All enumeration types.
       * Any object that can be retrieved by accessing a static field, property or method, or can be created through a public constructor.
       * Any object that supports ISerializable will get a line of code loading that object through a resource, and object will be serialized into a resource.
 
Конференция ".Net" » Сериализация коллекции в XML формат
Есть новые Нет новых   [118682   +10][b:0][p:0.002]