Invalid Core Property Type

Make a backup now, before investigating.

I’m not familiar with this bit of code your error mentions, seems to have been added after 5.3 as my scanner doesn’t pick it up on 5.3.

// Open because property type name table is a global cached object.
UE_AUTORTFM_ALWAYS_OPEN
int32 FPropertyTypeNameTable::StoreByIndex(const FPropertyTypeNameNode* Nodes, int32 Count)
{
	if (Count == 1 && Nodes->Name.IsNone())
	{
		return 0;
	}

	UE_CLOG(Count > GPropertyTypeNameBlockOffsetCount, LogCore, Fatal,
		TEXT("Invalid property type name with %d nodes. This can happen when serializing from a corrupt or invalid archive."), Count);

	int32 Index;
	for (int32 BaseIndex = NextIndex.load(std::memory_order_relaxed);;)
	{
		const int32 RemainingCountInBlock = GPropertyTypeNameBlockOffsetCount - (BaseIndex & GPropertyTypeNameBlockOffsetMask);
		Index = BaseIndex + (RemainingCountInBlock <= Count ? RemainingCountInBlock : 0);
		if (LIKELY(NextIndex.compare_exchange_weak(BaseIndex, Index + Count, std::memory_order_relaxed)))
		{
			break;
		}
	}

	UE_CLOG(Index + Count > GPropertyTypeNameBlockCount * GPropertyTypeNameBlockOffsetCount, LogCore, Fatal,
		TEXT("Exceeded property type name capacity of %d nodes when storing %d nodes."),
		GPropertyTypeNameBlockCount * GPropertyTypeNameBlockOffsetCount, Count);

	const int32 BlockIndex = Index >> GPropertyTypeNameBlockOffsetBits;
	FPropertyTypeNameNode* Block = Blocks[BlockIndex].load(std::memory_order_acquire);
	if (UNLIKELY(!Block))
	{
		Block = AllocateBlock(BlockIndex);
	}
	const int32 BlockOffset = Index & GPropertyTypeNameBlockOffsetMask;
	for (FPropertyTypeNameNode* Target = Block + BlockOffset; Count > 0; --Count)
	{
		*Target++ = *Nodes++;
	}
	return Index;
}

After you have made a backup, you could always try to load a copy into 5.3 and see what happens. If it works on 5.3 you get more options to investigate what is needed to port to 5.4, or to restore the asset.