Though, really, I haven't tested it (or given it much thought ) so proceed with caution
EDIT: Probably worth noting that silently not changing an option like this is probably quite an unexpected behaviour for an end user to experience so it's not ideal... are you sure you need to approach it like that?
Yes, I am, because I modify the option before it is displayed to the user and even if the user just clicks okay without changing this value it is of course detected as changed. That's why I check in my verify part whether the options was indeed changed by the user (and is not my modified one), so that I can skip the change when it is not changed by the user.
@rugk you need to be more clear on what you actually want done. Is your "default" value being sent to the data writer? If it is, then isChanged will always be set to true, as the existing data will be different. Even setInternal would not work. If your default data is not sent to the data writer, try $dw->setInternal('field', 'data') (this does not validate the data sent, only checks to see if it is different, if it is not different, the key is unset from the data writer (which sounds like you want?)).
Personally a controller should be handling this, in my opinion, and let it check to see if the submitted value did change.
I recalled reading up on _setInternal when I looked something up in the datawriter abstract class, and it just stuck with me.
I still think this should be handled by a controller, as _preSave will either return false (throw the error), or return true (save the field, which you do not want). If the datawriter is custom (you are not extending an existing one) you could just remove the _preSave function from your datawriter, but that's not recommended as it is there for a good reason.
FWIW, I think my idea should work (with a small tweak) now I looked at it properly.
I forgot that $option was passed by reference, so presumably my original idea falls over because after verification the $dw uses the value of $option to set the option_value, hence using $dw->set there won't have any effect.
I tried @Chris D solution and it worked. Indeed it is passed as a reference - I should have sawn this. @Lawrence Yes probably with a controller this may be a more "clean" solution, but it is unnecessary complex to do this especially if you want to do it for multiple options.
So just setting the value (back) to the existing one is a simple and nice solution, which only requires a few code lines for such a small "feature".