Я давно решил эту проблему для октавы/матлаба, теперь мне нужно что-то для С#. Задача состояла в том, чтобы объединить две октавные структуры в одну. Я не нашел ни инструмента слияния, ни подходящего сериализатора, поэтому мне пришлось что-то придумать.
Самое важное концептуальное решение заключалось в том, чтобы разделить дерево структур на строки с полным путем и содержимым листа.
Основная идея была
- Сериализация структуры в строки, где каждая строка представляет базовую переменную (матрицу, строку, число с плавающей запятой,...)
- Массив или матрица структуры будут иметь индекс в пути.
- объединить два полученных текстовых файла, отсортировать строки
- обнаруживать коллизии и выполнять обработку коллизий (очень просто, потому что одни и те же свойства будут располагаться непосредственно друг над другом после сортировки строк)
- десериализовать
Пример:
>> s1
s1 =
скалярная структура, содержащая поля:
b =
2x2 struct array containing the fields:
bruch
t = Textstring
f = 3.1416
s =
scalar structure containing the fields:
a = 3
b = 4
будет сериализован в
root.b(1,1).bruch=txt2base('isfloat|[ [ 0, 4 ] ; [ 1, 0 ] ; ]');
root.b(1,2).bruch=txt2base('isfloat|[ [ 1, 6 ] ; [ 1, 0 ] ; ]');
root.b(2,1).bruch=txt2base('isfloat|[ [ 2, 7 ] ; [ 1, 0 ] ; ]');
root.b(2,2).bruch=txt2base('isfloat|[ [ 7 ] ; [ 1 ] ; ]');
root.f=txt2base('isfloat|[3.1416]');
root.s.a=txt2base('isfloat|[3]');
root.s.b=txt2base('isfloat|[4]');
root.t=txt2base('ischar|Textstring');
Преимущество этого метода в том, что его очень легко реализовать и он удобочитаем для человека. Сначала вам нужно написать две функции base2txt и txt2base, которые преобразуют базовые типы в строки и обратно. Затем вы просто рекурсивно проходите по дереву и записываете для каждого свойства структуры путь к свойству (здесь разделенный знаком «.») и содержимое в одну строку.
Большой недостаток в том, что, по крайней мере, моя реализация этого очень медленная.
Ответ на второй вопрос: Есть ли уже что-то подобное? Я не знаю... но я искал какое-то время, так что я так не думаю.
person
Marco Haschka
schedule
19.10.2016