Stores гарантирует, что можно многократно сохранять один и тот же Store, а в выходной файл попадет только 1 экземпляр данных; при это при многократном чтении будет возвращаться один и тот же указатель. Но для этого нужно, чтобы MyKey был расширением Stores.Store. Иначе вам придется самостоятельно обеспечивать "недублирование" - т.е. по сути делать тот же Stores, но только для своего списка. Я бы сделал на базе Stores вот так:

## Код:
```
TYPE MyKey = POINTER TO RECORD (Stores.Store) ... END;

PROCEDURE WriteList (t: Turn; w: Stores.Writer);
BEGIN
  WHILE t # NIL DO w.WriteStore(t); t := t.next END;
  w.WriteStore(NIL)
END WriteList;

PROCEDURE WriteKeys(k: MyKey; wr: Stores.Writer);
BEGIN
  WHILE k # NIL DO wr.WriteStore(k); k := k.next END;
  wr.WriteStore(NIL)
END WriteKeys;

PROCEDURE (t: Turn) Externalize (VAR w: Stores.Writer);
  VAR auxiliaryKeys: MyKey;
BEGIN
  w.WriteString (t.name); WriteKeys(t.firstKey, w)
END Externalize;

PROCEDURE (k: MyKey) Externalize (VAR wr: Stores.Writer);
BEGIN
  w.WriteByte (auxiliaryKeys.day);
  w.WriteByte (auxiliaryKeys.month);
  w.WriteByte (auxiliaryKeys.year);
  w.WriteSReal (auxiliaryKeys.price)
END Externalize;
```


Тогда чтение можно организовать по такой схеме:

## Код:
```
REPEAT rd.ReadStore(st); 
  IF st # NIL THEN ASSERT(st IS Turn, 20); 
    (* append store to the end of list *) 
  END
UNTIL st = NIL
```
