SoapFormatter и рекурсия, что сним просходит?
От: Lecha  
Дата: 20.09.10 09:01
Оценка:
Подскажите уважаемые, что просходит:
Задача сериализовать в соап некую древовоидную иерархию,
для примера набросал простенький тест:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;

namespace TestSoap
{
    class Program
    {
        static void Main(string[] args)
        {
            A root = new A();
            root.val = "root";

            A child = new A();
            child.val = "child";

            A childchild = new A();
            childchild.val = "childchild";

            child.children.Add(childchild);
            root.children.Add(child);
            

            FileStream fsw = File.Create("test.soap");
            A.SerializeSoap(fsw, root);
            fsw.Close();


            FileStream fsr = File.OpenRead("test.soap");
            A readed= A.DeSerializeSoap(fsr);
            fsr.Close();

            Console.WriteLine("OK");
            Console.ReadKey();
        }
    }

    [Serializable]
    class A
    {
        public string val;
        public ArrayList children = new ArrayList();

        public static void SerializeSoap(Stream stream, A a)
        {
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(stream,a);
            foreach (A child in a.children)
            {

                SerializeSoap(stream, child);
            }
        
        }

        public static A DeSerializeSoap(Stream stream)
        {

            SoapFormatter sf = new SoapFormatter();
            A a= sf.Deserialize(stream) as A;

            ArrayList tmpchildren = new ArrayList();
            foreach (A child in a.children)
            {

                A  readedchild= DeSerializeSoap(stream) as A;
                tmpchildren.Add(readedchild);
            }

            a.children = tmpchildren;
            return a;

        }
    
    }
}


В рекурсиии SoapFormatter бросает исключение, что совершенно мне непонятно, поток то тот же, позиция в нем тоже.
Экспериментально нашел что не нравится ему ресоздание SoapFormatter каждый раз, вкартце вот так все работает:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;

namespace TestSoap
{
    class Program
    {
        static void Main(string[] args)
        {
            A root = new A();
            root.val = "root";

            A child = new A();
            child.val = "child";

            A childchild = new A();
            childchild.val = "childchild";

            child.children.Add(childchild);
            root.children.Add(child);
            

            FileStream fsw = File.Create("test.soap");
            A.SerializeSoap(fsw, root);
            fsw.Close();


            FileStream fsr = File.OpenRead("test.soap");
            A readed= A.DeSerializeSoap(fsr,null);
            fsr.Close();

            Console.WriteLine("OK");
            Console.ReadKey();
        }
    }

    [Serializable]
    class A
    {
        public string val;
        public ArrayList children = new ArrayList();

        public static void SerializeSoap(Stream stream, A a)
        {
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(stream,a);
            foreach (A child in a.children)
            {

                SerializeSoap(stream, child);
            }
        
        }

        public static A DeSerializeSoap(Stream stream, SoapFormatter sf)
        {
            if (sf == null)
            {
                sf = new SoapFormatter();
            }

            A a= sf.Deserialize(stream) as A;

            ArrayList tmpchildren = new ArrayList();
            foreach (A child in a.children)
            {

                A  readedchild= DeSerializeSoap(stream,sf) as A;
                tmpchildren.Add(readedchild);
            }

            a.children = tmpchildren;
            return a;

        }
    
    }
}


Вопросы к гурам: почему так????, Какие то еше решениая кроме, того что я уже нашел? Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.