Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504

Преобразовать Node в строку и наоборот

05.03.2013, 20:46. Показов 9675. Ответов 119
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomTree
{
    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;
            }
        }
        public class NodeCollection : System.Collections.ObjectModel.Collection<Node>
        {
            internal 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);
            }
        }
    }
}
класс формирует древовидную структуру,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
задача состоит в следующем, нужно сформированное дерево преобразовать в object или строку, передать клиенту(с этим я справлюсь), затем у клиента из object или строки опять получить древовидную структуру
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2013, 20:46
Ответы с готовыми решениями:

Не удается неявно преобразовать тип "UnsafeStack.Node" в "UnsafeStack.Node*" - как исправить?
Узел: namespace UnsafeStack { public unsafe struct Node { public int value; public Node* next; ...

Преобразовать заглавные буквы в строчные и наоборот с использованием таблицы символов
Всем привет! Не подскажете как, допустим в слове &quot;ПриВеТ&quot;, преобразовать заглавные буквы в строчные и наоборот используя таблицу символов?...

Быстрые алгоритмы сборки байтового массива в строку и наоборот
Всем привет! Народ не поделитесь быстрым алгоритмом сборки байтового массива из строки (только цифры) и разборки массива в строку? К...

119
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 23:26
Студворк — интернет-сервис помощи студентам
Кстати, с сериализацией List'ов тоже есть свои приколы. Вот например:
http://sergeyteplyakov.blogspo... st_26.html
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
10.03.2013, 23:26
Цитата Сообщение от kelod Посмотреть сообщение
я тут гуал мучал там вроде пишут что можно в проекте моно использовать вместо нет , правда у меня появляется вопрос как осуществить связь проектов в решении , если создать два проекта один тот что есть другой с моно, хотя я конечно может чего не так понимаю . Что касаетс9 встроенного класса я про него уже писал тут мне сказали что он только для отображения деревьев но не для хранения. В строку и мой класс отлично превращаеться но что с ним делать потом , как превратить опять в класс?
как тот же гугл указывает - сериализация один из способов передачи данных между ПК, втч разными платформами... у меня так флеш с .нетом работает
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 23:27
hepper, я так понимаю, что у него есть сервер, у сервера есть "игры", у каждой игры есть "комнаты"... Ну что я вам расказываю, про garena наверняка знаете
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 23:27  [ТС]
так 4 байта на каждом уровне будут или как? Что то я не понимаю про что вы
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
10.03.2013, 23:32
Цитата Сообщение от Psilon Посмотреть сообщение
hepper, я так понимаю, что у него есть сервер, у сервера есть "игры", у каждой игры есть "комнаты"... Ну что я вам расказываю, про garena наверняка знаете
признаюсь -не знаю... но думаю что там весь "поток" информации (разовый) будет сводится к 1-2 десяткам цифр/знаков...
одно дело передавать сложную структуру и большие объемы данных.... другое мелочь типа x-y-z-id в огромном списке...
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
10.03.2013, 23:41  [ТС]
мне деревья нужны пока только в двух случаях хранение игроков в комнатах и хранение координат их появления в картах и оба эти дерева обещают быть огромными можно и без деревьев но кроме как хранить пустые элементы в массивах я способа не вижу , это памяти нужно как у главного компа пентагона

Добавлено через 3 минуты
Цитата Сообщение от hepper Посмотреть сообщение
признаюсь -не знаю... но думаю что там весь "поток" информации (разовый) будет сводится к 1-2 десяткам цифр/знаков...
одно дело передавать сложную структуру и большие объемы данных.... другое мелочь типа x-y-z-id в огромном списке...
Список координат будет передаваться сразу весь для карты , но зато 1 раз а с комнатами по разному и постоянно

Добавлено через 2 минуты
гонять пустоту во всех случаях плохо , про поиск и думать даже не хочеться
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.03.2013, 23:55
kelod, ну игровые объекты в таком дереве явно хранить не стоит. А Сервер-комната-игрок вполне можно, т.к. кол-во игроков не превысит миллиона, а это лишних 4мб на все дерево. 100 тысяч игроков - 400килобайт, вообще мелочь.
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
11.03.2013, 00:03
kelod, Вот пример как гонять все в байты. Может найдете применение.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
11.03.2013, 00:05  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
kelod, ну игровые объекты в таком дереве явно хранить не стоит. А Сервер-комната-игрок вполне можно, т.к. кол-во игроков не превысит миллиона, а это лишних 4мб на все дерево. 100 тысяч игроков - 400килобайт, вообще мелочь.
Игровые объекты все будут у клиента в префабах а в деревьях только служебная информация и если 4 байта на уровень то при 5 уровнях и 100 000 получаем 2 мб на дерево дерева пока 2 уже 4 и куча выделяемых под деревьев пусть 8 и того допустим 10 мб лишних и это единовременно учитывая что данные по сети отправляюсься получаем дофига пустого трафика
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
11.03.2013, 00:10
Цитата Сообщение от kelod Посмотреть сообщение
того допустим 10 мб лишних и это единовременно учитывая что данные по сети отправляюсься получаем дофига пустого трафика
Добро пожаловать в ансейф и маршаллинг - бремя жлобов)

как известно - большинство прогеров вынуждены быть жлобами

тут я ковырял структуры
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
11.03.2013, 01:06  [ТС]
Цитата Сообщение от Noob.net Посмотреть сообщение
Добро пожаловать в ансейф и маршаллинг - бремя жлобов)

как известно - большинство прогеров вынуждены быть жлобами

тут я ковырял структуры
не ругайтесь на меня такими словами, я ведь не волшебник, я ведь только

Добавлено через 9 минут
попробывать нужно наверно маршаллинг всё таки, убедиться что он не работает и идти в магазин за бубном
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.03.2013, 01:11
kelod, не "пустой", а вполне обычный трафик. Списки не сильно экономнее: скрытые поля, свойства, открытые свойства ... А массивы ресайзить замучаетесь. В общем, имхо сначала стоить сделать удобную систему, а потом расширать там, где и если понадобится. А то гибкие системы обычно гнутся совсем не там, где ожидалось, а сопровождать быструю, но малопонятную ( и неработающую) систему - затруднительно.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
11.03.2013, 01:29  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
kelod, не "пустой", а вполне обычный трафик. Списки не сильно экономнее: скрытые поля, свойства, открытые свойства ... А массивы ресайзить замучаетесь. В общем, имхо сначала стоить сделать удобную систему, а потом расширать там, где и если понадобится. А то гибкие системы обычно гнутся совсем не там, где ожидалось, а сопровождать быструю, но малопонятную ( и неработающую) систему - затруднительно.
про массив это я так ляпнул случайно, атавизм
да я уже хочу что бы хоть как то работало но работало, понятно что я щас самолёт не изобрету, хотя бы велосипед с одним треугольным колесом

Добавлено через 3 минуты
Цитата Сообщение от Noob.net Посмотреть сообщение
kelod, Вот пример как гонять все в байты. Может найдете применение.
попробовал код из вашего примера
C#
1
2
3
4
5
6
7
8
9
10
public static byte[] StructToByte<T>(T struc) where T : struct
        {
            int size = Marshal.SizeOf(struc);//размер структуры
            IntPtr ptPoint = Marshal.AllocHGlobal(size);//указатель на память размером с структуру
            Marshal.StructureToPtr(struc, ptPoint, true);//в неупр память из управл
            byte[] buff = new byte[size];//создаем массив байтов для хранение сериализ структуры
            Marshal.Copy(ptPoint, buff, 0, size);//копируем из указателя в массив байтов
            Marshal.FreeHGlobal(ptPoint);//освобождаем память
            return buff;//возвращаем массив байтов
        }
при обращении StructToByte<Node>(Options.coord), ругается , говорит что тип не должен допускать значение null? с объектом как Вы понимаете аналогичная картина
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
11.03.2013, 01:42
kelod, Так написано же
C#
1
where T : struct
Вот вам с сериализацией без ансейва.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 static void Main(string[] args)
        {           Some s = new Some();
            s.W = 10;
 
            byte[] arr = ObjectToByteArray(s);
            Console.ReadLine();
        }
        [Serializable]
        class Some { public int W { get; set; } }
 
        // Convert an object to a byte array
        private static byte[] ObjectToByteArray(Object obj)
        {
            if (obj == null)
                return null;
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, obj);
            return ms.ToArray();
        }
        // Convert a byte array to an Object
        private static Object ByteArrayToObject(byte[] arrBytes)
        {
            MemoryStream memStream = new MemoryStream();
            BinaryFormatter binForm = new BinaryFormatter();
            memStream.Write(arrBytes, 0, arrBytes.Length);
            memStream.Seek(0, SeekOrigin.Begin);
            Object obj = (Object)binForm.Deserialize(memStream);
            return obj;
        }

Convert Object/Struct to byte[] without serialization.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
11.03.2013, 22:17  [ТС]
C#
1
2
3
4
BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, obj);
            return ms.ToArray();
это мы уже проходили не десериализируеться так в MONO

а вот это
C#
1
2
3
MemoryStream stream = new MemoryStream();
                                XmlUtility.WriteStructure(new Node("qaz"),stream);
                                byte[] b=stream.GetBuffer();
выдало что то новенькое)
2013-03-11 02:06:18,787 [8] ERROR Photon.SocketServer.PeerBase - System.ArgumentException: Невозможно упаковать тип "CustomTree.Node" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл.

Добавлено через 20 часов 7 минут
и как с этим бороться ?
0
Заблокирован
12.03.2013, 03:32
каждая нода дерева однозначно представляется строкой вида Path: node0\node1\node2;node0\node3 и т.п.
т.е. достаточно передать первым параметром количество Node, а дальше строки путей преобразованные в байты.
List<byte> buff = new List<byte>(); buff.AddRange(Encoding.UTF8.GetBytes(pat h + string.NewLine));

На стороне сервера по путям восстановить дерево.

Добавлено через 7 минут
стандартные средства серелизации сохраняют с собой все матаданные сереилизуемого типа, т.е. для того чтобы, серелизовать\десерелизовать объекты в разных проектах, требуется ссылка на одну и туже сборку, где объявлены эти типы.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
12.03.2013, 10:39  [ТС]
Цитата Сообщение от loro Посмотреть сообщение
каждая нода дерева однозначно представляется строкой вида Path: node0\node1\node2;node0\node3 и т.п.
т.е. достаточно передать первым параметром количество Node, а дальше строки путей преобразованные в байты.
List<byte> buff = new List<byte>(); buff.AddRange(Encoding.UTF8.GetBytes(pat h + string.NewLine));

На стороне сервера по путям восстановить дерево.

Добавлено через 7 минут
стандартные средства серелизации сохраняют с собой все матаданные сереилизуемого типа, т.е. для того чтобы, серелизовать\десерелизовать объекты в разных проектах, требуется ссылка на одну и туже сборку, где объявлены эти типы.
а как же быть если у одного родителя 10 детей?? и у каждого детёнка ещё 10???
ссылка и так на 1 общую dll
0
Заблокирован
12.03.2013, 10:49
kelod, думаешь это много?

Добавлено через 51 секунду
и полные пути совершенно не обязательны, если определить порядок.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
12.03.2013, 10:56  [ТС]
Цитата Сообщение от loro Посмотреть сообщение
kelod, думаешь это много?

Добавлено через 51 секунду
и полные пути совершенно не обязательны, если определить порядок.
можно пример
0
0 / 0 / 0
Регистрация: 02.09.2014
Сообщений: 2
25.12.2015, 13:26
http://msdn.microsoft.com/ru-r... rshal.aspx
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2015, 13:26

Преобразовать строку
Дано целое число N (&gt; 0) и строка S. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить...

Преобразовать строку
добрый день, знаю, тема заезженная, но походу у меня руки из ж*пы ((( есть такая строка я ее парсю с хтмл страницы и вывожу в листбокс,...

Преобразовать строку в массив
Привет всем, у меня есть вот такой код: WebClient client = new WebClient(); client.Headers =...

Преобразовать строку в int
Есть файл: 13 23 41 12 32 0 2 4

Преобразовать строку в дату
Помогите пожалуйста не могу сделать, как преобразовать время в строку,работаю c Excel, надо вытащить с ячейки время указанное в ней и ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru