MY IT AND SPORTS BLOG

Latest

Дълбоко копие на обект в C# чрез сериализация.

Дълбоко копие на обект означава копирания обект и копието да нямат еднаква референция, както и всички техни полета (от референтен тип).

Стандартния подход за създаване на дълбоко копие е обхождане на стойностите на свяко поле на обекта и “наливането” им в нови обекти от типа на полетата, който в последствие се “наливат” в копието. От гледна точка на бързодействие това е по-правилния вариант, според мен. Въпреки това при по-сложни ООП проекти този подход се оказва доста трудоемък. Доста по бърз за реализация е варианта с сриализиране на желания обект и в последствие неговата десериализация, при която върнатия обект просто се присвоява на копието.

Има и няколко условия за да може това да се реализира. Всеки клас, който ние сме дефинирали и се използва като поле в клонирания клас, трябва изрично да се означи като “сриализуем”, чрез атрибута [Serializable] над класа. Ако ще се сериализират циклични данни, трябва да се използва двоично сериализиране, понеже XML поради дървовидната си структура не може да се използва за сериализиране на обкети с циклична структура.

Време е за пример. В него ще използваме обект от тип граф с поле възел. Като класа възел има поле стойност и поле списък от наследници(също възли). За да направим дълбоко копие по обикновенния начин, трябва да обходим с DFS или BFS и да създаваме нови възли със същите стойности, като тези на оригинала. Подхода чрез сериализация е далеч по лесен за реализация, както ще видите по-надоло.

Това е нашия граф:

  1.  [Serializable]
  2.     public class Node<T>
  3.     {
  4.         public T value;
  5.         public List<Node<T>> descendantNodes;
  6.         public Node(T inValue)
  7.         {
  8.             value = inValue;
  9.             descendantNodes = new List<Node<T>>();
  10.         }
  11.         public Node()
  12.         {
  13.             descendantNodes = new List<Node<T>>();
  14.         }
  15.     }
  16.     [Serializable]
  17.     public class Graph<T>
  18.     {
  19.         public Node<T> root;
  20.         public Graph(Node<T> inRoot)
  21.         {
  22.             root = inRoot;
  23.         }
  24.         public Graph()
  25.         {
  26.             root = new Node<T>();
  27.         }
  28.         public override string ToString()
  29.         {
  30.             StringBuilder sb = new StringBuilder();
  31.             Queue<Node<T>> queue = new Queue<Node<T>>();
  32.             queue.Enqueue(root);
  33.             while (queue.Count != 0)
  34.             {
  35.                 Node<T> currentNode = queue.Dequeue();
  36.                 sb.Append(currentNode.value.ToString()+” “);
  37.                 foreach (Node<T> item in currentNode.descendantNodes)
  38.                 {
  39.                     queue.Enqueue(item);
  40.                 }
  41.             }
  42.             return sb.ToString();
  43.         }
  44.     }

Ето и метода, който ще използваме, за да създадем дълбоко копие на нашия граф:

  1.  public static object DeepCopy(object sourceObject)
  2.         {
  3.             IFormatter formatter = new BinaryFormatter();
  4.             formatter.Context = new StreamingContext(StreamingContextStates.Clone);
  5.             Stream memStream = new MemoryStream();
  6.             formatter.Serialize(memStream, sourceObject);
  7.             memStream.Position = 0;
  8.             object resultObject = formatter.Deserialize(memStream);
  9.             return resultObject;
  10.         }

Ето и нашите тестове, за да видим наяве ползата от нашата функция:

  1. static void Main(string[] args)
  2.         {
  3.             Graph<int> graph = CreateGraph();
  4.             Console.WriteLine(graph);
  5.             Console.WriteLine();
  6.             Graph<int> copyWithSameReferance = graph;
  7.             Console.WriteLine(“Originalniq graph: {0}”, graph);
  8.             Console.WriteLine(“Kopie na grafa no s ednakva referenciq: {0}”,copyWithSameReferance);
  9.             Console.WriteLine(“object.ReferenceEquals(graph,copyWithSameReferance) = {0}”, object.ReferenceEquals(graph, copyWithSameReferance));
  10.             Console.WriteLine();
  11.             Graph<int> copyWithSameFiledRef = new Graph<int>(graph.root);
  12.             Console.WriteLine(“Originalniq graph: {0}”, graph);
  13.             Console.WriteLine(“Kopie na grafa no s ednakva referenciq na poleto: {0}”, copyWithSameFiledRef);
  14.             Console.WriteLine(“object.ReferenceEquals(graph,copyWithSameFiledRef) = {0}”, object.ReferenceEquals(graph, copyWithSameFiledRef));
  15.             Console.WriteLine(“object.ReferenceEquals(graph.root, copyWithSameFiledRef.root) = {0}”, object.ReferenceEquals(graph.root, copyWithSameFiledRef.root));
  16.             Console.WriteLine();
  17.             Graph<int> deepCopyGraph = (Graph<int>)DeepCopy(graph);
  18.             Console.WriteLine(“Originalniq graph: {0}”, graph);
  19.             Console.WriteLine(“Dulboko kopie na grafa: {0}”, deepCopyGraph);
  20.             Console.WriteLine(“object.ReferenceEquals(graph,deepCopyGraph) = {0}”, object.ReferenceEquals(graph, deepCopyGraph));
  21.             Console.WriteLine(“object.ReferenceEquals(graph.root, deepCopyGraph.root) = {0}”, object.ReferenceEquals(graph.root, deepCopyGraph.root));
  22.             Console.WriteLine();
  23.         }

Тук е изхода от изпълнението на нашия пример:

Прикачам и целия проект на примера. Надявам се че съм Ви бил полезен 🙂

Advertisements

Реч на Адам Савидж към завършилите от випуск 2012 на “Sarah Lawrence College”.

Един от хората на които искрено съм се възхищавал от малък е Адам Савидж – водещ на едно от най-готините и популярни предавания “Ловци на Митове”. Това според мен е човека с най-невероятната работа на света и която той очевидно върши с кеф! Затова страшно се зарадвах като намерих тази негова реч към завършилите от випуск 2012 на “Sarah Lawrence College”. Може би най-полезната реч която съм чул след тази на Стийв Джобс. Изгледайте видеото – ЗАСЛУЖАВА СИ! 🙂

Първи спортен пост :)

Тук ще пиша за тренировки, хранителни режими, както и ще споделя моя скромен личен опит. 🙂

Преглед на jQuery UI

Всеки уеб програмист е запознат и е използвал JQuery за извършване на асинхронни JavaScript извиквания и обхождане на елементи от DOM дървото от страна на клиента. Подобнa на нея библиотека jQuery UI предлага още повече вградена функционалност надградена на основата на jQuery. Тази библиотека позволява и създаването на собствени UI функционалности.

jQuery UI е напълно безплатна и може да бъде свалена от тук. Примери и документация могат да бъдат намерени тук.

jQuery UI класификация

jQuery UI се разделя на четири категории, към които спадат различните функционалности.

Интеракции

Към тази категория спадат функционалностите, които подобряват интеракцията на потребителя със страницата

  1. Draggable – Позволява определен обект да се влачи с мишката по екрана.
  2. Droppable – Позволява върху един елемент от DOM да се драгне друг, като може да се окаже точно кой елемент да приема.
  3. Sortable –  Позволява множество от елемент да се подрежда от самия потребител(списън например).

Уиджети

Тази категоря би заинтригувала най-много програмистите, понеже предлага нови интерфейс елементи. Това спестява много писане и нерви.

  1. Диалог –  Показва pop up-и и стилизирани съобщения.
  2. Акордеон – Контейнер, който се свива и разтяга при клик с мишката.
  3. Поле за избор на дата.
  4. Табове
  5. Прогрес бар

Ефекти

Функционалности, които позволяват правенето на анимации и правят потребителския интерфейс по богат.

Utilities

Използват се за разширяване на гореспоменатите категории като могат да се създават нови ефекти и уиджети и други.

Примери

Поле за избор на дата

  1.     <head>
  2.         <meta charset="utf-8">
  3.         <title>
  4.             Example
  5.         </title>
  6.         <link href="styles.css" rel="stylesheet" />
  7.     </head>
  8.     <body>
  9.         <script>
  10.         $(function() {
  11.             $( "#pickDate" ).datepicker();
  12.         });
  13.         </script>
  14.  
  15.         <div class="example">
  16.  
  17.         <p>Date: <input type="text" id="pickDate"></p>
  18.  
  19.         </div>
  20.     </body>

Заключение

Надявам се, че тази статия ви е спестила поне малко време и главоболия! Кой знае, Вие може да създадете следващият супер готин уиджет 🙂

Здрвейте и Добре дошли в моя блог!

Това е първият ми пост в този блог. В него ще споделям опита който имам в ИТ сверата и Спорта, както и информацията на която съм попаднал и съм намерил полезна/интересна. Приятно четене!