Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2013, 11:34   #1
kelod
Пользователь
 
Регистрация: 05.07.2010
Сообщений: 33
По умолчанию проблема с десериализацией класса

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

System.Runtime.Serialization.Serial izationException: Field "Collection`1+items" not found in class CustomTree.Node+NodeCollection
at System.Runtime.Serialization.Format ters.Binary.ObjectReader.ReadTypeMe tadata (System.IO.BinaryReader reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x00000] in <filename unknown>:0

классы запакованы в dll и доступны обоим проектам, вот код классов, формирующих дерево:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CustomTree
{
    /*	class Program
        {
            static void Main(string[] args)
            {
                var root = new Node("root");
                var c1 = root.AddNode("child1");
                var c2 = root.AddNode("child2");
                var c1_1 = c1.AddNode("child1_1");
                var c1_2 = c1.AddNode("child1_2");
                var c2_1 = new Node("child2_1");
                c2_1.Parent = c2;
                var c2_2 = c2.AddNode("child2_2");
                Console.Write(root.ToString());
                Console.WriteLine("\n");
                Console.WriteLine("Удаляем узлы\n");
                c2.Children.Remove(c2_2);
                c2_1.Parent = null;
                Console.WriteLine(root.ToString());
                Console.ReadKey();
            }
        }*/
    [Serializable]
    public class Node
    {
        public Node()
        {
            _children = new NodeCollection(this);
        }
        
        public Node(string name)
        {
            _children = new NodeCollection(this);
            this.Name = name;
        }
        public Node AddNode(string name)
        {
            var rv = new Node(name);
            this.Children.Add(rv);
            return rv;
        }
        Node _parent;
        public Node Parent
        {
            get
            {
                return _parent;
            }
            set
            {
                if (Parent != null || value == null)
                {
                    Parent.Children.Remove(this);
                }
                else
                {
                    value.Children.Add(this);
                }
                _parent = value;
            }
        }
        public string Name { get; set; }
        NodeCollection _children;
        public override string ToString()
        {
            var rv = new StringBuilder(Name);
            foreach (Node ch in Children)
            {
                SubNodeToString(ch, rv);
            }
            return rv.ToString();
        }
        public int Level
        {
            get
            {
                return Parent != null ? this.Parent.Level + 1 : 0;
            }
        }
        void SubNodeToString(Node n, StringBuilder sb)
        {
            sb.Append("\n" + repeat("\t", n.Level));
            sb.Append(n.Name);
            sb.Append(string.Format(" (Parent: {0})", n.Parent.Name));
            foreach (Node ch in n.Children)
            {
                SubNodeToString(ch, sb);
            }
        }
        string repeat(string s, int count)
        {
            var rv = new StringBuilder();
            for (int i = 0; i < count; i++) { rv.Append(s); };
            return rv.ToString();
        }
        public NodeCollection Children
        {
            get
            {
                return _children;
            }
        }

        [Serializable]
        public class NodeCollection : System.Collections.ObjectModel.Collection<Node>
        {
            public NodeCollection(Node owner)
            {
                _owner = owner;
            }
            Node _owner;
            protected override void InsertItem(int index, Node item)
            {
                if (!this.Contains(item))
                {
                    base.InsertItem(index, item);
                    item._parent = _owner;
                }
            }
            protected override void RemoveItem(int index)
            {
                this[index]._parent = null;
                base.RemoveItem(index);
            }
        }
    }
}
kelod вне форума Ответить с цитированием
Старый 08.03.2013, 00:13   #2
kelod
Пользователь
 
Регистрация: 05.07.2010
Сообщений: 33
Печаль

неужели не кто не знает?
за весь день ни одного поста ...
kelod вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ проблема с конструктором базового класса halcyon Помощь студентам 7 09.05.2012 10:05
Проблема с созданием класса stragedog Общие вопросы Delphi 1 26.04.2012 20:14
Проблема обращения к элементу класса. Alexcomeback Общие вопросы по Java, Java SE, Kotlin 2 23.10.2010 15:17
Проблема с созданием класса Arkuz Общие вопросы Delphi 10 18.04.2010 14:18
Проблема с методом класса Ivan_32 Общие вопросы C/C++ 4 27.03.2009 10:43