// создать ссылку , прокси объекта для группы с индеском ничего не знает о адресе в основном файле. Чтобы прочитать объект, надо в индесном файле узнать реальный адрес // надо создать ДисковоеХранилище где АдресОбъекта это не АдресВФайле, а АдресВИндексе. Адресв Файле должен быть скрыт // прокси с Адресом в файле может быть не верным, кто-то может его изменить, или удалить. // группы в индесным файлом должны иметь ссылки не на адрес в основном файле а номер в индексе // примитивы с неизменной длинной нет смысла переносить. А группы могут переноситься в конец файла или свободное пространство. // ГркппаОбъектов при сохранении в индесном файле. сначала зарезирвировать в индексном файле номер для себя и набор индексных адресов для объектов //сохранить этот набор как ссылки на объекты, потом начинать сохраять объекты и сопоставлять номер индекса номеру байта в основном файле // это аболютно не похоже что делается сейчас (запись в ленту), первого этапа сохранения адресов индесксов нет вообще. дальше похоже только до или после сохранения объекта // надо запомнить номер позиции в индесном файле. // Хотя если ГруппаОбъектов используется только целиком, читается целиком, удаляется целиком, то вышеопианная процедура не нужна.Все работает нормально // Если группа это группа адресов (=узел), объекты это самостоятельные объекты с собственным адресом. Самостоятельные (независимые от группы), т.е. они могут меняться // незатрагивая группу public ПроксиОбъекта ДайПроксиОбъекта(int индекс) { var прокси = new ПроксиОбъекта() { АдресПримитива = АдресВФайлеПоИндексу(индекс) }; return(прокси); }
public ПроксиОбъекта ДайЭлемент(int индекс, Адрес адресВладельца) // дается копия элемента { var элемент = new ПроксиОбъекта(); элемент.АдресПримитива = (Адрес)Список[индекс].СобственныйАдресПримитива.Копировать(); //элемент.Примитив = Список[индекс].Копировать(); СписокВладельцевЭлементов[индекс].Add(адресВладельца); //Подписать на изменеия значения, адреса, значения примитива return(элемент); }
public ПроксиОбъекта ДайЭлемент(Адрес адрес, Адрес адресВладельца) // дается копия элемента { var индекс = ((АдресВГруппе)адрес).НомерВГруппе; var элемент = new ПроксиОбъекта(); элемент.АдресПримитива = (Адрес)Список[индекс].СобственныйАдресПримитива.Копировать(); //элемент.Примитив = Список[индекс].Копировать(); СписокВладельцевЭлементов[индекс].Add(элемент.СобственныйАдресПримитива); //собственный адрес элемента еще не определен, указывается адрес в Куче адреса //Подписать на изменеия значения, адреса, значения примитива return(элемент); }