I am basing my own system off Unreal's architecture. I've decided that the networking aspect should be as separated from the objects themselves. Firstly, it is important to make a distinction between "objects" and networked class instances. My concept; and thus that of unreal is to have network class instances that may have physical meshes etc.
Anyway, They way I manage data for different clients is to have "ReplicationChannels". Here's my document https://docs.google.com/document/d/1nRE29bgGW0cJwmn1t3-e92dVmZG4HZqOkHubssWfWms/edit
Essentially there is a channel created on the server and client for every object that exists multiplied by the number of connected peers. Then we can save the state of networked attributes on the channel. I use a form of hashing to determine if the value has changed, to avoid issues with muteable types. I use descriptors in python to set a dirty flag when an attribute is changed but that's part of the bIsDirty variable that Unreal uses and so I still compare the custom hash of each value when I ask the channels to replicate data.
I'm happy to tell you more about what I'm doing. It's interesting as I am coming from the other end; adding a component framework after creating a replication system. However, in my situation I shall be using a more system-based approach. (it's sort of a hybrid, as attributes (things that are sent over the network) can be instances of classes and therefore treated like components or they may be fundamental data types..