Проблема с сериализацией класса

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Проблема с сериализацией класса

Сообщение Amed » 10.07.2007 (Вт) 22:52

VS 2005.

В VB.NET сериализую класс, написанный в C#, вида:
Код: Выделить всё
    [Serializable]
    public class L
    {
        public string Name;

        public double[,] WC;
        public double[] N;

        protected L NextL;

        public string GetNextName()
        {
            return (NextL.Name);
        }

        public void ...(...)
        {
                ...
        }

        // Конструктор
        public L(int )
        {
                ...
        }

        // Конструктор без параметров
        public L()
        {
            ...
        }

        private double AF()
        {
            return (1);
        }

        ...
    }

Вот таким кодом:

Код: Выделить всё
        Dim fs As New FileStream("C:\test.txt", FileMode.OpenOrCreate)
        Dim s As New XmlSerializer(GetType(L))
        s.Serialize(fs, s)


На второй строчке - исключение. There was an error reflecting type 'NeuroClasses.Layer'.
При этом простейший класс с пустым конструктором и одной int-переменной сериализуется в два счета.

На всякий случай пробовал, как указано вот здесь: http://bbs.vbstreets.ru/viewtopic.php?t=29150
Не помогло, результат тот же (да и ситуация другая, у меня не подкласс).

Есть решение?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.07.2007 (Вт) 23:53

protected L NextL -- это же бесконечная, в принципе, конструкция. Как её серилизовать?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.07.2007 (Вт) 23:57

В VS2003 можно было секретной спецопцией сохранить на диск исходник динамически компилируемого сериализатора, и подебажить, чтобы узнать в чём конкретно проблема.
Не знаю, осталась ли эта фича в 2005.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.07.2007 (Ср) 11:11

GSerg, в принципе бесконечная. Реально же - она конечна, и ограничена 2 "ступенями", допустим.

Т.е. есть три экземпляра класса L1, L2, L3.
L1.NextL указывает на L2, L2.NextL указывает на L3. L3.NextL = {NULL}.

Возможно, сериализатору не нравится даже такая вложенность...

tyomitch, в 2005 есть фича оттрассировать стек InnerException, который вот такой в моем случае:

at System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type)
at System.Xml.Serialization.StructModel.GetFieldModel(FieldInfo fieldInfo)
at System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)
at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel)

О! Перекомпилировал снова - и стал появляться другой эксепшн:
Cannot serialize member 'L.WC' of type 'System.Double[,]', see inner exception for more details.

Все, разобрался.
Надо было посмотреть InnerException InnerException'а, который сказал:
Cannot serialize object of type System.Double[,]. Multidimensional arrays are not supported.

Буду читать доки - возможно, многомерные массивы поддерживаются другими сериализаторами.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.07.2007 (Ср) 20:26

BionaryFormatter поддерживает вроде бы все подряд
GSerg
Если она по факту окажеться бесконечной то будет exception, если же по факту конструкция конечна то все сериализуется
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 19.07.2007 (Чт) 9:36

Итак, наконец-то дошли руки проделать элементарнейший эксперимент.

C#:
Код: Выделить всё
    [Serializable]
    public class Test
    {
        public int TestNumber;
        public Test TestInstance;
    }


VB.NET:
Код: Выделить всё
        ' Создаем кучу объектов со ссылками на их реинкарнации
        Dim t11, t21, t31 As New NeuroClasses.Test
        t11.TestNumber = 1
        t21.TestNumber = 2
        t31.TestNumber = 3

        t11.TestInstance = t21
        t21.TestInstance = t31

        ' Сериализуем объект t11
        Dim xmls As New XmlSerializer(GetType(NeuroClasses.Test))
        Dim writer As New StreamWriter("C:\serialization.txt")

        xmls.Serialize(writer, t11)
        writer.Close()


После этого смотрим serialization.txt:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TestNumber>1</TestNumber>
  <TestInstance>
    <TestNumber>2</TestNumber>
    <TestInstance>
      <TestNumber>3</TestNumber>
    </TestInstance>
  </TestInstance>
</Test>


Действительно, хитрый компилятор все правильно сериализует.
Если же законтачить t31 на t11, генерится эксепшн There was an error generating the XML document -> A circular reference was detected while serializing an object of type [Namespace].Test


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 104

    TopList