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. 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? Thank you. - HH |
Henry,
> On 14 Nov 2017, at 15:02, henry <[hidden email]> 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 > > |
Thank you, Sven. That was a much better place for internalizing after reconstituting. I now have bi-directional substitutions working with STON. I’m grateful.
Sent from ProtonMail Mobile
Henry, > On 14 Nov 2017, at 15:02, henry 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 > > |
Free forum by Nabble | Edit this page |