DataPtr Field::ShouldSerialize( void* instance ) const { // never write discard fields if ( m_Flags & FieldFlags::Discard ) { return NULL; } ObjectPtr object = Registry::GetInstance()->CreateInstance( m_DataClass ); DataPtr data = ThrowCast< Data >( object ); data->ConnectField( instance, this ); // always write force fields if ( m_Flags & FieldFlags::Force ) { return data; } // check for empty/null/invalid state if ( !data->ShouldSerialize() ) { return NULL; } // don't write field at the default value DataPtr defaultData = CreateDefaultData(); if ( defaultData.ReferencesObject() && defaultData->Equals(data) ) { return NULL; } return data; }