Хотел задать вопрос, нет ли уже готовых макросов или средств библиотеки для сериализации классов содержащих свойства списки list[] в xml и обратно, в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков, похоже XmlSerializer придется долго мучить чтобы заставить сериализовать свойство типа list[]? Есть варианты проще или все же писать с нуля?
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, CodingUnit, Вы писали:
CU>>в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков
K>Не понял. А что, сериализация вариантов не работает на списках? Список это ведь вариант. K>И атрибутами K>
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)
Здравствуйте, _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
Здравствуйте, 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 никто еще не сталкивался с этой проблемой?
Дело в том, что XmlSerializer руководствуется реализацией IEnumerable (список реализует этот интерфейс) и потому работает с ним как с коллекцией. Для корректной работы XML-сериализатора, думаю, нужно реализовать IXmlSerializable в list[t].
Здравствуйте, hardcase, Вы писали:
H>Дело в том, что XmlSerializer руководствуется реализацией IEnumerable (список реализует этот интерфейс) и потому работает с ним как с коллекцией. Для корректной работы XML-сериализатора, думаю, нужно реализовать IXmlSerializable в list[t].
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, hardcase, Вы писали:
H>>Дело в том, что XmlSerializer руководствуется реализацией IEnumerable (список реализует этот интерфейс) и потому работает с ним как с коллекцией. Для корректной работы XML-сериализатора, думаю, нужно реализовать IXmlSerializable в list[t].
K>Не понимаю, каким образом? K>
Здравствуйте, CodingUnit, Вы писали:
CU>Хотел задать вопрос, нет ли уже готовых макросов или средств библиотеки для сериализации классов содержащих свойства списки list[] в xml и обратно, в библиотеке есть сериализация variant-ов, но ничего не нашел по поводу списков, похоже XmlSerializer придется долго мучить чтобы заставить сериализовать свойство типа list[]? Есть варианты проще или все же писать с нуля?
Это вопрос скорее относится к исользованию XmlSerializer. Так уж он спроектирован, что использовать его с енизменяемыми структурами данных довольно неудобно. Мы еще в Янусе с ним мучались когда пытались сериализовать значения типа DateTime. Попробуй обратиться с этим вопросом в форуме по .Net. Може там подскажут как обойти природу XmlSerializer.
Если XmlSerializer не является обязетельным требованием, то его можно заменить на что-то другое. Например на DataContractSerializer из System.Runtime.Serialization.dll. Он поддерживается только начиная с .Net 3.0, но вроде как на сегодня явлется "выбором партии".
ЗЫ
А вообще, конечно давно пора было бы написать макросы генерирующие код сериализации. Блы бы самый гибкий и эффективный способ.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.