Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }