we could easily tell if the object counts changed, that would be something practical and useful i guess. we could furthermore try to find duplicates and linked duplicates, not sure if that is relevent information though.
Here’s a list of object properties:
<bpy_struct, PointerProperty("rna_type")>
<bpy_struct, StringProperty("name")>
<bpy_struct, IntProperty("users")>
<bpy_struct, BoolProperty("use_fake_user")>
<bpy_struct, BoolProperty("tag")>
<bpy_struct, BoolProperty("is_updated")>
<bpy_struct, BoolProperty("is_updated_data")>
<bpy_struct, BoolProperty("is_library_indirect")>
<bpy_struct, PointerProperty("library")>
<bpy_struct, PointerProperty("data")>
<bpy_struct, EnumProperty("type")>
<bpy_struct, EnumProperty("mode")>
<bpy_struct, BoolProperty("layers")>
<bpy_struct, BoolProperty("layers_local_view")>
<bpy_struct, BoolProperty("select")>
<bpy_struct, FloatProperty("bound_box")>
<bpy_struct, PointerProperty("parent")>
<bpy_struct, EnumProperty("parent_type")>
<bpy_struct, IntProperty("parent_vertices")>
<bpy_struct, StringProperty("parent_bone")>
<bpy_struct, EnumProperty("track_axis")>
<bpy_struct, EnumProperty("up_axis")>
<bpy_struct, PointerProperty("proxy")>
<bpy_struct, PointerProperty("proxy_group")>
<bpy_struct, CollectionProperty("material_slots")>
<bpy_struct, PointerProperty("active_material")>
<bpy_struct, IntProperty("active_material_index")>
<bpy_struct, FloatProperty("location")>
<bpy_struct, FloatProperty("rotation_quaternion")>
<bpy_struct, FloatProperty("rotation_axis_angle")>
<bpy_struct, FloatProperty("rotation_euler")>
<bpy_struct, EnumProperty("rotation_mode")>
<bpy_struct, FloatProperty("scale")>
<bpy_struct, FloatProperty("dimensions")>
<bpy_struct, FloatProperty("delta_location")>
<bpy_struct, FloatProperty("delta_rotation_euler")>
<bpy_struct, FloatProperty("delta_rotation_quaternion")>
<bpy_struct, FloatProperty("delta_scale")>
<bpy_struct, BoolProperty("lock_location")>
<bpy_struct, BoolProperty("lock_rotation")>
<bpy_struct, BoolProperty("lock_rotation_w")>
<bpy_struct, BoolProperty("lock_rotations_4d")>
<bpy_struct, BoolProperty("lock_scale")>
<bpy_struct, FloatProperty("matrix_world")>
<bpy_struct, FloatProperty("matrix_local")>
<bpy_struct, FloatProperty("matrix_basis")>
<bpy_struct, FloatProperty("matrix_parent_inverse")>
<bpy_struct, CollectionProperty("modifiers")>
<bpy_struct, CollectionProperty("constraints")>
<bpy_struct, PointerProperty("game")>
<bpy_struct, CollectionProperty("vertex_groups")>
<bpy_struct, EnumProperty("empty_draw_type")>
<bpy_struct, FloatProperty("empty_draw_size")>
<bpy_struct, FloatProperty("empty_image_offset")>
<bpy_struct, IntProperty("pass_index")>
<bpy_struct, FloatProperty("color")>
<bpy_struct, PointerProperty("field")>
<bpy_struct, PointerProperty("collision")>
<bpy_struct, PointerProperty("soft_body")>
<bpy_struct, CollectionProperty("particle_systems")>
<bpy_struct, PointerProperty("rigid_body")>
<bpy_struct, PointerProperty("rigid_body_constraint")>
<bpy_struct, BoolProperty("hide")>
<bpy_struct, BoolProperty("hide_select")>
<bpy_struct, BoolProperty("hide_render")>
<bpy_struct, PointerProperty("animation_data")>
<bpy_struct, PointerProperty("animation_visualization")>
<bpy_struct, PointerProperty("motion_path")>
<bpy_struct, BoolProperty("use_slow_parent")>
<bpy_struct, FloatProperty("slow_parent_offset")>
<bpy_struct, BoolProperty("use_extra_recalc_object")>
<bpy_struct, BoolProperty("use_extra_recalc_data")>
<bpy_struct, EnumProperty("dupli_type")>
<bpy_struct, BoolProperty("use_dupli_frames_speed")>
<bpy_struct, BoolProperty("use_dupli_vertices_rotation")>
<bpy_struct, BoolProperty("use_dupli_faces_scale")>
<bpy_struct, FloatProperty("dupli_faces_scale")>
<bpy_struct, PointerProperty("dupli_group")>
<bpy_struct, IntProperty("dupli_frames_start")>
<bpy_struct, IntProperty("dupli_frames_end")>
<bpy_struct, IntProperty("dupli_frames_on")>
<bpy_struct, IntProperty("dupli_frames_off")>
<bpy_struct, CollectionProperty("dupli_list")>
<bpy_struct, BoolProperty("is_duplicator")>
<bpy_struct, EnumProperty("draw_type")>
<bpy_struct, BoolProperty("show_bounds")>
<bpy_struct, EnumProperty("draw_bounds_type")>
<bpy_struct, BoolProperty("show_name")>
<bpy_struct, BoolProperty("show_axis")>
<bpy_struct, BoolProperty("show_texture_space")>
<bpy_struct, BoolProperty("show_wire")>
<bpy_struct, BoolProperty("show_all_edges")>
<bpy_struct, BoolProperty("show_transparent")>
<bpy_struct, BoolProperty("show_x_ray")>
<bpy_struct, PointerProperty("grease_pencil")>
<bpy_struct, PointerProperty("pose_library")>
<bpy_struct, PointerProperty("pose")>
<bpy_struct, BoolProperty("show_only_shape_key")>
<bpy_struct, BoolProperty("use_shape_key_edit_mode")>
<bpy_struct, PointerProperty("active_shape_key")>
<bpy_struct, IntProperty("active_shape_key_index")>
<bpy_struct, BoolProperty("use_dynamic_topology_sculpting")>
<bpy_struct, PointerProperty("cycles_visibility")>
Not all of them are sensible, such as is_updated (to be used with a frame handler). But would you want to check all that are?
The hurdle is pretty much that you need in-depth checks as simple == comparisons fail, and they would be pretty specific per type.