Подскажите уважаемые, что просходит:
Задача сериализовать в соап некую древовоидную иерархию,
для примера набросал простенький тест:
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;
}
}
}
Вопросы к гурам: почему так????, Какие то еше решениая кроме, того что я уже нашел? Спасибо