"Оборванные" данные в XData

Автор Тема: "Оборванные" данные в XData  (Прочитано 8848 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
"Оборванные" данные в XData
« : 06-12-2018, 23:18:16 »
Всем привет. Хочу понять, как такая проблема вообще может случится и кто виноват - автокад или плагин.

Суть такова - я в примитив записываю строковые данные, которые представляют собой json. Сам json получается так:
Код - C# [Выбрать]
  1. var resultBuffer = new ResultBuffer();
  2. Dictionary<string, object> propertiesDataDictionary = new Dictionary<string, object>();
  3. // заполнение данными....
  4. using (MemoryStream stream = new MemoryStream())
  5. {
  6.     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, object>),
  7.         new DataContractJsonSerializerSettings() { UseSimpleDictionaryFormat = true });
  8.     serializer.WriteObject(stream, propertiesDataDictionary);
  9.     byte[] bytes = stream.ToArray();
  10.     string json = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
  11.     AcadHelpers.WriteMessageInDebug($"Length of json: {json.Length}");
  12.     resultBuffer.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, json));
  13. }
  14.  
  15. return resultBuffer;

Добавление в XData выглядит так:
Код - C# [Выбрать]
  1. using (var tr = AcadHelpers.Database.TransactionManager.StartTransaction())
  2. {
  3.     var ent = tr.GetObject(axis.BlockId, OpenMode.ForWrite);
  4.     ent.XData = axis.GetDataForXData();
  5.     tr.Commit();
  6. }

Результат должен быть примерно таким:
Цитировать
{"LineType":"осевая","LineTypeScale":1,"TextStyle":"Standard","MarkersPosition":"Bottom","Fracture":10,"BottomFractureOffset":0,"TopFractureOffset":0,"MarkersDiameter":10,"MarkersCount":1,"FirstMarkerType":"Type1","SecondMarkerType":"Type1","ThirdMarkerType":"Type1","BottomOrientMarkerVisible":false,"TopOrientMarkerVisible":false,"OrientMarkerVisibilityDependency":false,"OrientMarkerType":"Type1","ArrowsSize":3,"TextHeight":3.5,"FirstTextPrefix":"","FirstText":"1","FirstTextSuffix":"","SecondTextVisibility":false,"SecondTextPrefix":"","SecondText":"","SecondTextSuffix":"","ThirdTextVisibility":false,"ThirdTextPrefix":"","ThirdText":"","ThirdTextSuffix":"","BottomOrientText":"","TopOrientText":"","BottomLineAngle":0,"TopLineAngle":0,"EndPoint":"0$-642.494183297735$0","LayerName":"По умолчанию","Scale":"1:30","StyleGuid":"00000000-0000-0000-0000-000000000000"}

Да, строка длинная, но долго тестировал - проблем не было.

Сегодня мне скинули чертеж, в котором в примитиве вот такие данные:
Цитировать
{"LineType":"осевая","LineTypeScale":1,"TextStyle":"_ГОСТ","MarkersPosition":"Bottom","Fracture":10,"BottomFractureOffset":0,"TopFractureOffset":0,"MarkersDiameter":10,"MarkersCount":1,"FirstMarkerType":"Type1","SecondMarkerType":"Type1","ThirdMarkerType"

Я уточнял у пользователя - во время работы в автокаде происходила фатальная ошибка. Возможно ли такое, что ошибка произошла ровно в тот момент, когда происходила фиксация транзакции?

Пытаюсь понять, как вообще такой эффект может произойти? И можно ли его вызвать самому?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 806
  • Карма: 166
    • Мои плагины к Автокаду
Re: "Оборванные" данные в XData
« Ответ #1 : 06-12-2018, 23:39:10 »
Может просто кто-то прогнал Audit и обрезалось до 250 символов

Отмечено как Решение Александр Ривилис 06-12-2018, 23:56:10

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 806
  • Карма: 166
    • Мои плагины к Автокаду
Re: "Оборванные" данные в XData
« Ответ #2 : 06-12-2018, 23:40:13 »
Ну точно - там же ровно 255

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: "Оборванные" данные в XData
« Ответ #3 : 06-12-2018, 23:53:20 »
Суть такова - я в примитив записываю строковые данные,
Длина строки в Xdata - 255 символов. Так что если > 255, то разбивай по 255 символов. Ну и 16K на все (т.е. и твои и чужие!!!) Xdata в примитиве/объекте.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: "Оборванные" данные в XData
« Ответ #4 : 07-12-2018, 09:06:04 »
Неприятно как-то. Почему Автокад позволяет положить и хранить строку свыше 255 символов, но после команды Audit режет её? Почему не резать сразу? Чтобы сразу можно было это заметить, а не вот так
И сразу вопрос про 16К на все - он сразу сигнализирует/обрежет/не даст добавить или как и со строкой - добавит, а потом порежет данные?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: "Оборванные" данные в XData
« Ответ #5 : 07-12-2018, 10:20:26 »
Александр Пекшев aka Modis, на форуме была тема посвященная этому вопросу, ссылку не дам, но помню что была и там и про ограничения и про 16К было

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: "Оборванные" данные в XData
« Ответ #6 : 07-12-2018, 12:22:56 »
Владимир Шу, ага нашел - вот она. Дмитрий исследовал.
Самое забавное - ведь читал её. Но мозг - штука уникальная - забыл про это совсем. Хотя, там ответы на все мои вопросы

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: "Оборванные" данные в XData
« Ответ #7 : 07-12-2018, 12:32:32 »
А вот интересно - если я заменю хранение в Xdata, на хранение в XRecord (я храню одну строчку, но очень длинную), решит ли этой моей проблемы, без больших переделок? Или при работе с XRecord я могу столкнуться с чем-то подобным?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: "Оборванные" данные в XData
« Ответ #8 : 07-12-2018, 13:32:21 »
Или при работе с XRecord я могу столкнуться с чем-то подобным?
Разбивать на 255 символов придётся. Не будет ограничения на 16К, но потребуется еще и копировать это всё вместе с объектом, придумывать логику обработки... Не думаю, что это хороший выход.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: "Оборванные" данные в XData
« Ответ #9 : 07-12-2018, 14:16:12 »
А вот интересно - если я заменю хранение в Xdata, на хранение в XRecord (я храню одну строчку, но очень длинную), решит ли этой моей проблемы, без больших переделок? Или при работе с XRecord я могу столкнуться с чем-то подобным?
С ограничениями - вряд ли. А вот другие трудности могут возникнуть. Например, если перетаскивается перерисованный объект. При этом часто создаётся временная копия объекта. XData в этом случае у копии будут, а вот словаря расширения - нет. Потому что словарь может быть только у объекта внутри базы данных. Так что, в этом и любых подобных случаях придётся искать сперва исходный объект, затем его словарь...
Разбивать на 255 символов придётся.
Насколько я помню, в Xrecords таких ограничений нет. Вроде где-то на болоте исследовали, что в Xrecord можно гигабайты информации помещать.
Но, для уверенности, неплохо было бы это проверить, конечно же.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: "Оборванные" данные в XData
« Ответ #10 : 07-12-2018, 14:19:23 »
Цитата: Александр Ривилис от 07-12-2018, 12:32:21

    Разбивать на 255 символов придётся.

Насколько я помню, в Xrecords таких ограничений нет. Вроде где-то на болоте исследовали, что в Xrecord можно гигабайты информации помещать.
Но, для уверенности, неплохо было бы это проверить, конечно же.
255 символов - это длина на один код группы:



Суммарно может быть очень много. До 2 Гбайт данных на XRecord.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: "Оборванные" данные в XData
« Ответ #11 : 07-12-2018, 14:46:03 »
Значит, неправильно помню :)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: "Оборванные" данные в XData
« Ответ #12 : 07-12-2018, 15:24:58 »
Кстати, если использовать XRecord, можно же строку перевести в байты и записать под кодом BinaryChunk. Можно даже не строку писать, а сериализовать класс с данными.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: "Оборванные" данные в XData
« Ответ #13 : 07-12-2018, 15:42:24 »
Кстати, если использовать XRecord, можно же строку перевести в байты и записать под кодом BinaryChunk. Можно даже не строку писать, а сериализовать класс с данными.
Только там длина еще меньше, так как BinaryChunk содержит в себе длину этой строки:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: "Оборванные" данные в XData
« Ответ #14 : 07-12-2018, 16:37:02 »
Эх, и тут ограничения... :)