Сериализация списков
От: CodingUnit Россия  
Дата: 16.08.10 13:49
Оценка:
Хотел задать вопрос, нет ли уже готовых макросов или средств библиотеки для сериализации классов содержащих свойства списки list[] в xml и обратно, в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков, похоже XmlSerializer придется долго мучить чтобы заставить сериализовать свойство типа list[]? Есть варианты проще или все же писать с нуля?
Re: Сериализация списков
От: Klapaucius  
Дата: 17.08.10 06:14
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков


Не понял. А что, сериализация вариантов не работает на списках? Список это ведь вариант.
И атрибутами
[System.Serializable]
[Nemerle.MarkOptions (System.Serializable)]

список помечен.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[2]: Сериализация списков
От: _nn_ www.nemerleweb.com
Дата: 17.08.10 07:00
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, CodingUnit, Вы писали:


CU>>в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков


K>Не понял. А что, сериализация вариантов не работает на списках? Список это ведь вариант.

K>И атрибутами
K>
K>[System.Serializable]
K>[Nemerle.MarkOptions (System.Serializable)]
K>

K>список помечен.

Список не реализует метод Add:

module Program
{
  Main() : void
  {
    def a = 1 :: 2 :: [];
     
    def x = XmlSerializer(a.GetType());
    def ms = MemoryStream();
    x.Serialize(ms, x);
     
    
    _ = ms.Seek(0, SeekOrigin.Begin);    
    def o = x.Deserialize(ms);
    def oa = o :> list.[int];
    
    oa.Iter(WriteLine);    
  }
}


Unhandled Exception: System.InvalidOperationException: To be XML serializable, types which inherit from IEnumerable must
have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. Nemerle.Core.list`1+Cons[[Sy
stem.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] does not implement Add(System.
Object).
at System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type, TypeFlags& flags)
at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean thro
wOnError)
at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultN
amespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Сериализация списков
От: Klapaucius  
Дата: 17.08.10 07:17
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Список не реализует метод Add:


Ну это понятно. А option, например, не имеет конструктора this(). Стандартная .net сериализация и не должна для иммутабельных объектов работать. Но ведь я-то ответил на следующее:
>в библиотеке есть сериализация variant-ов
Я не знаю, что он имеет в виду, но если есть сериализация вариантов, то и сериализация списков, по логике, должна быть.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: Сериализация списков
От: CodingUnit Россия  
Дата: 17.08.10 07:29
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, _nn_, Вы писали:


__>>Список не реализует метод Add:


K>Ну это понятно. А option, например, не имеет конструктора this(). Стандартная .net сериализация и не должна для иммутабельных объектов работать. Но ведь я-то ответил на следующее:

>>в библиотеке есть сериализация variant-ов
K>Я не знаю, что он имеет в виду, но если есть сериализация вариантов, то и сериализация списков, по логике, должна быть.

нужна сериализация классов, либо вариантов со встроенными свойствами или полями типа списков, например:


public class SerializeTest
{

public Data : list[SomeType] {get; set;}

public other : int {get; set;}

}



нужно сохранять класс в xml и считывать оттуда же, в .net есть стандартная сериализация XmlSerializer, но похоже есть проблемы с сериализацией по умолчанию, наверное надо как то расширить сериализацию чтобы она принимала свойства неизвестного типа list[T] и поместить это в стандартную библиотеку или расширить список так чтобы он удовлетворял условиям сериализации xml, в любом случае сериализация списка по моему является очень насущной в повседневной деятельности разработчика на nemerle. Что тут могут сказать разработчики на .net никто еще не сталкивался с этой проблемой?
Re[3]: Сериализация списков
От: hardcase Пират http://nemerle.org
Дата: 17.08.10 09:17
Оценка:
Здравствуйте, _nn_, Вы писали:


__>Список не реализует метод Add:



Дело в том, что XmlSerializer руководствуется реализацией IEnumerable (список реализует этот интерфейс) и потому работает с ним как с коллекцией. Для корректной работы XML-сериализатора, думаю, нужно реализовать IXmlSerializable в list[t].
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Сериализация списков
От: Klapaucius  
Дата: 17.08.10 10:31
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Дело в том, что XmlSerializer руководствуется реализацией IEnumerable (список реализует этот интерфейс) и потому работает с ним как с коллекцией. Для корректной работы XML-сериализатора, думаю, нужно реализовать IXmlSerializable в list[t].


Не понимаю, каким образом?
public interface IXmlSerializable
{
  XmlSchema GetSchema();
  void ReadXml(XmlReader reader);
  void WriteXml(XmlWriter writer);
}

Список-то иммутабельный — как у него реализовывать ReadXml, который возвращает void?
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[5]: Сериализация списков
От: hardcase Пират http://nemerle.org
Дата: 17.08.10 10:48
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, hardcase, Вы писали:


H>>Дело в том, что XmlSerializer руководствуется реализацией IEnumerable (список реализует этот интерфейс) и потому работает с ним как с коллекцией. Для корректной работы XML-сериализатора, думаю, нужно реализовать IXmlSerializable в list[t].


K>Не понимаю, каким образом?

K>
K>public interface IXmlSerializable
K>{
K>  XmlSchema GetSchema();
K>  void ReadXml(XmlReader reader);
K>  void WriteXml(XmlWriter writer);
K>}
K>

K>Список-то иммутабельный — как у него реализовывать ReadXml, который возвращает void?

Признаюсь, на интерфейс этот я не смотрел.
Да, реализация такого интерфейса в иммутабельной структуре данных была бы бессмысленной.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Сериализация списков
От: Ka3a4oK  
Дата: 17.08.10 14:38
Оценка:
H>Признаюсь, на интерфейс этот я не смотрел.
H>Да, реализация такого интерфейса в иммутабельной структуре данных была бы бессмысленной.

В F# есть списки? Они сериализуются?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re: Сериализация списков
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.08.10 21:02
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Хотел задать вопрос, нет ли уже готовых макросов или средств библиотеки для сериализации классов содержащих свойства списки list[] в xml и обратно, в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков, похоже XmlSerializer придется долго мучить чтобы заставить сериализовать свойство типа list[]? Есть варианты проще или все же писать с нуля?


Это вопрос скорее относится к исользованию XmlSerializer. Так уж он спроектирован, что использовать его с енизменяемыми структурами данных довольно неудобно. Мы еще в Янусе с ним мучались когда пытались сериализовать значения типа DateTime. Попробуй обратиться с этим вопросом в форуме по .Net. Може там подскажут как обойти природу XmlSerializer.

Если XmlSerializer не является обязетельным требованием, то его можно заменить на что-то другое. Например на DataContractSerializer из System.Runtime.Serialization.dll. Он поддерживается только начиная с .Net 3.0, но вроде как на сегодня явлется "выбором партии".

ЗЫ

А вообще, конечно давно пора было бы написать макросы генерирующие код сериализации. Блы бы самый гибкий и эффективный способ.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.