Henry,
On 14 Nov 2017, at 15:02, henry <henry@callistohouse.club> wrote:
Hello, I am trying to extend STON to allow for substitutions as data is written out or read in. On the write side I got it working as #nextPut: is recursively called, so that is the perfect place to substitute before an object is written. I have tested and my changes work well, where I have an arbitrary object as a subObject and it gets substituted out for my Descriptor object.
OK good.
I am having difficult on the read side identifying where a substitution lookup should occur after decoding the object on the input stream. I want to inflate the Descritpor object, with its data, and call for a possible substitution. As it is a Descriptor, it should get substituted with the right bits on the read side. I chose to try and do this in the method #setReference:to: and put the substitute into the objects list. This did not work. Where is a good place to look within STON to do a read-side post-substitution?
In STONReader>>#parseObject | targetClass reference object | [ reference := self newReference. targetClass := self parseClass. object := targetClass fromSton: self. self setReference: reference to: object ] ... I would try just re-assigning object with your custom substitute. Like this MySTONReader>>#parseObject | targetClass reference object | [ reference := self newReference. targetClass := self parseClass. object := targetClass fromSton: self. object := object resolveSubstitution. self setReference: reference to: object ] ... The references are used if the same (#==) object is used twice, then you get something like STON fromString: '[Point[1,2],@2]'. which is an 2 element Array where the exact same object is in both positions (structure sharing). This works with circular references too (but be careful because the inspector might loop). HTH, Sven
Thank you.
- HH