public NetworkObjectListObjectMetaDataList Serialize() { var list = new NetworkObjectListObjectMetaDataList(); var sortedTypes = _types.Values.ToList(); sortedTypes.Sort((lhs, rhs) => Comparer <uint> .Default.Compare(lhs.Id, rhs.Id)); foreach (var type in sortedTypes) { var metaData = new ObjectMetaData { TypeId = type.Id, TypeName = type.Type.FullName }; foreach (var member in type.Members) { metaData.Members.Add(new ObjectMember { TypeId = member.MetaData.Id }); } list.MetaData.Add(metaData); } return(list); }
public void Deserialize(NetworkObjectListObjectMetaDataList list) { if (list == null) { throw new ArgumentNullException(nameof(list)); } _transmitterToReceiverMap = new Dictionary <uint, TypeMetaData>(); //Construct a temporary map mapping our types by name so we can perform fast lookup var localLookup = _types.ToDictionary( entry => entry.Value.MapFromType ?? entry.Value.Type.FullName, entry => entry.Value); foreach (var metaData in list.MetaData) { if (!localLookup.TryGetValue(metaData.TypeName, out var type)) { throw new InvalidOperationException($"The type {metaData.TypeName} (id: {metaData.TypeId}) has no type mapping to it on the receiving end"); } //Validate the type's members if (metaData.Members.Count != type.Members.Count) { throw new InvalidOperationException( $"The type {metaData.TypeName} (receiving mapping: {type.Type.FullName}) has a different number of members (transmitter: {metaData.Members.Count} receiver: {type.Members.Count})"); } //the underlying type of a member can differ between transmitter and receiver depending on the converter, so don't try to match up the types //Add the lookup _transmitterToReceiverMap.Add(metaData.TypeId, type); } }