Экземляр класса в расширенные данные примитива

Автор Тема: Экземляр класса в расширенные данные примитива  (Прочитано 6452 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Читал забугорные форумы, но с заморским языком немного туго в части специфики вопроса. Хотелось бы услышать ответ от русскоязычных профи)
В общем - возможно-ли (а точнее - как?) хранить экземпляр класса в расширенных данных?
Допустим есть класс
Код - C# [Выбрать]
  1. public class ExampleClass
  2. {
  3.     private int x;
  4.     private int y;
  5.  
  6.     public ExampleClass(int x, int y)
  7.     {
  8.          this.x = x;
  9.          this.y = y;
  10.     }
  11.  
  12.     #region Getters and Setters
  13. }
Я создаю его экземпляр
Код - C# [Выбрать]
  1. ExampleClass objToStoreInXRecord = new ExampleClass(3, 5);
Дальше мне нужно поместить его в расширенные данные примитива
Так вот - как это сделать?

Как я понял - один из вариантов - это делать сериализацию класса. Пример есть тут - http://adndevblog.typepad.com/autocad/2012/05/serialize-a-net-class-into-an-autocad-drawing-database.html.
Это единственный способ?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Это единственный способ?
чем он не устроил?

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Это единственный способ?
чем он не устроил?
Столкнулся с рядом проблем при реализации сериализации - http://www.cyberforum.ru/csharp-beginners/thread1488874.html. Отсутствие должных знаний дает о себе знать(
Видимо придется на корню все переписывать, придумывая новую реализацию

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Столкнулся с рядом проблем при реализации сериализации - http://www.cyberforum.ru/csharp-beginners/thread1488874.html.
Сериализация - она разной бывает. XElement реализует интерфейс IXmlSerializable. Я предпочитаю полностью управлять процессом сериализации (см. ISerializable и IXmlSerializable) вместо того, чтобы использовать реализацию, предоставляемую в .net по умолчанию.
Цитировать
Отсутствие должных знаний дает о себе знать(
Видимо придется на корню все переписывать, придумывая новую реализацию
Можно, конечно и поизобретать велосипед попереписывать но, как очень сложный вариант - можно почитать материал по теме сериализации (правда сложного там, как ни странно, ничего нет), дабы устранить "отсуствие должных знаний" - выбор за тобой. На чтение, вместе с попить кофе, можно в один-два вечера уложиться.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я правда пока не понял в чем суть вопроса. Но насколько понял - я храню сериализованные объекты в РД. Основной подход в том что все "сложные" данные не подлежащие сериализации (например Point3d) надо хранить в более простом виде (например аналогичном своем классе). Но методы и свойства сериализованного класса вполне могут возвращать данные любых типов - главное что-бы они хранились в "простом" виде, а метод их получения возвращал их в нужной форме. Хорошим плюсом является и то, что если структура "исходных данных" класса не меняются, можно добавлять любое количество свойств и методов обрабатывающих эти данные - это не повлияет на совместимость с уже созданными примитивами, посему лучше заранее получше продумать "формат" данных класса в сторону расширения.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Для такого простого объекта, как в примере, не нужно никакой сериализации:
Код - C# [Выбрать]
  1. public class ExampleClass
  2.     {
  3.         private int x;
  4.         private int y;        
  5.  
  6.         public ExampleClass(int x, int y)
  7.         {
  8.             this.x = x;
  9.             this.y = y;
  10.         }
  11.  
  12.         /// <summary>
  13.         ///
  14.         /// </summary>
  15.         /// <param name="typeValueX"></param>
  16.         /// <param name="typeValueY"></param>
  17.         public ExampleClass(TypedValue typeValueX, TypedValue typeValueY)
  18.         {
  19.             x = (int)typeValueX.Value;
  20.             y = (int)typeValueY.Value;            
  21.         }
  22.  
  23.         /// <summary>
  24.         /// Преобразование в массив TypedValue из двух элементов
  25.         /// </summary>
  26.         /// <returns></returns>
  27.         public TypedValue[] ToTypedValues()
  28.         {
  29.             return new TypedValue[]
  30.             {
  31.                 new TypedValue((int)DxfCode.Int32, x),
  32.                 new TypedValue((int)DxfCode.Int32, y)
  33.             };
  34.         }
  35.  
  36.         /// <summary>
  37.         /// Получение списка объектов из записи в РД или Extension Dictionary
  38.         /// </summary>
  39.         /// <param name="typedValues">Массив TypedValues из РД или ExtDict</param>
  40.         /// <returns></returns>
  41.         public static List<ExampleClass> GetObjectsFromTypedValues(IEnumerable<TypedValue> typedValues)
  42.         {
  43.             List<ExampleClass> ret = new List<ExampleClass>();
  44.  
  45.             for (int i = 0; i < typedValues.Count(); i += 2)
  46.             {
  47.                 ret.Add(new ExampleClass(typedValues.ElementAt(i), typedValues.ElementAt(i + 1)));
  48.             }
  49.  
  50.             return ret;
  51.         }
  52.  
  53.         /// <summary>
  54.         /// Преобразование коллекции объектов в список TypedValues для сохранения в РД или ExtDict
  55.         /// </summary>
  56.         /// <param name="exClassObjs"></param>
  57.         /// <returns></returns>
  58.         public static List<TypedValue> ObjectsToTypedValues(IEnumerable<ExampleClass> exClassObjs)
  59.         {
  60.             List<TypedValue> ret = new List<TypedValue>();
  61.  
  62.             foreach (ExampleClass exClassObj in exClassObjs)
  63.             {
  64.                 ret.AddRange(exClassObj.ToTypedValues());
  65.             }
  66.  
  67.             return ret;
  68.         }
  69.     }