示例#1
0
        private void WriteAddedAndChangedReferences(ExtendedBinaryWriter writer)
        {
            List <SyncSource> changedSyncSourceObjects = _dirtySyncSourceObjects.ToList();
            var changedAndNewReferenceUnion            = new HashSet <SyncSource>(_addedSyncSourceObjects);

            // Merge the new references and the added ones
            // Because it is possible for references to be both added and changed as wel
            changedAndNewReferenceUnion.UnionWith(changedSyncSourceObjects);

            int referenceCount = changedAndNewReferenceUnion.Count;

            writer.Write7BitEncodedInt(referenceCount);

            foreach (SyncSource syncSourceObject in changedAndNewReferenceUnion)
            {
                writer.Write7BitEncodedInt(syncSourceObject.ReferenceId);

                if (_addedSyncSourceObjects.Contains(syncSourceObject))
                {
                    Settings.TypeEncoder.WriteType(syncSourceObject.BaseObject.GetType(), writer);
                    syncSourceObject.WriteFull(writer);
                }
                else
                {
                    syncSourceObject.WriteChanges(writer);
                }
            }
        }
示例#2
0
 private void WriteRemovedReferences(ExtendedBinaryWriter writer)
 {
     writer.Write7BitEncodedInt(_removedSyncSourceObjects.Count);
     foreach (SyncSource removedSyncSourceObject in _removedSyncSourceObjects)
     {
         writer.Write7BitEncodedInt(removedSyncSourceObject.ReferenceId);
     }
 }
示例#3
0
 private void WriteUntrackedReferences(ExtendedBinaryWriter writer)
 {
     lock (_pendingUntrackedSyncSourceObjects)
     {
         writer.Write7BitEncodedInt(_pendingUntrackedSyncSourceObjects.Count);
         foreach (SourceSynchronizer syncSource in _pendingUntrackedSyncSourceObjects)
         {
             writer.Write7BitEncodedInt(syncSource.ReferenceId);
         }
     }
 }
示例#4
0
        /// <summary>
        ///     Converts type into a compact integer array which can be decoded using <see cref="ReadType" />
        /// </summary>
        /// <returns></returns>
        public void WriteType(Type type, ExtendedBinaryWriter writer)
        {
            var output = new Queue <int>();

            EncodeTypeRecursive(output, type);
            writer.Write7BitEncodedInt(output.Count);
            foreach (int identifier in output)
            {
                writer.Write7BitEncodedInt(identifier);
            }
        }
            public void Write(ExtendedBinaryWriter writer, IFieldSerializer keySerializer,
                              IFieldSerializer valueSerializer)
            {
                writer.Write((byte)_action);

                switch (_action)
                {
                case NotifyCollectionChangedAction.Add:
                    keySerializer.Serialize(_items[0].Key, writer);
                    valueSerializer.Serialize(_items[0].Value, writer);
                    break;

                case NotifyCollectionChangedAction.Replace:
                    keySerializer.Serialize(_items[0].Key, writer);
                    valueSerializer.Serialize(_items[0].Value, writer);
                    break;

                case NotifyCollectionChangedAction.Remove:
                    keySerializer.Serialize(_items[0].Key, writer);
                    break;

                case NotifyCollectionChangedAction.Reset:
                {
                    writer.Write7BitEncodedInt(_items.Count);
                    foreach (KeyValuePair <TKey, TValue> item in _items)
                    {
                        keySerializer.Serialize(item.Key, writer);
                        valueSerializer.Serialize(item.Value, writer);
                    }

                    break;
                }
                }
            }
示例#6
0
            public void Write(ExtendedBinaryWriter writer, ISerializer keySerializer)
            {
                writer.Write((byte)_action);

                switch (_action)
                {
                case NotifyCollectionChangedAction.Add:
                    keySerializer.Write(_items[0], writer);
                    break;

                case NotifyCollectionChangedAction.Replace:
                    keySerializer.Write(_items[0], writer);
                    break;

                case NotifyCollectionChangedAction.Remove:
                    keySerializer.Write(_items[0], writer);
                    break;

                case NotifyCollectionChangedAction.Reset:
                {
                    writer.Write7BitEncodedInt(_items.Count);
                    foreach (TKey item in _items)
                    {
                        keySerializer.Write(item, writer);
                    }
                    break;
                }
                }
            }
示例#7
0
 public void WriteAddedTypes(ExtendedBinaryWriter writer)
 {
     writer.Write7BitEncodedInt(_addedCustomTypes.Count);
     foreach (var type in _addedCustomTypes)
     {
         writer.Write(type.AssemblyQualifiedName);
     }
 }
 /// <summary>
 ///     Foreach connection, pad with connection synchronizationTick.
 /// </summary>
 /// <param name="synchronizationTick"></param>
 /// <returns></returns>
 public byte[] SetTick(int synchronizationTick)
 {
     using var memoryStream = new MemoryStream();
     using var writer       = new ExtendedBinaryWriter(memoryStream);
     writer.Write7BitEncodedInt(synchronizationTick);
     writer.Write(_synchronizationPacket);
     return(memoryStream.ToArray());
 }
        public override void WriteFull(ExtendedBinaryWriter binaryWriter)
        {
            const int commandCount = 1;

            binaryWriter.Write7BitEncodedInt(commandCount);
            Command resetCommand = Command.FromReset(BaseObject.ToList());

            resetCommand.Write(binaryWriter, _keySerializer, _valueSerializer);
        }
示例#10
0
        public override void Write(ExtendedBinaryWriter writer, object value)
        {
            var collection = (IList)value;

            writer.Write7BitEncodedInt(collection.Count);
            for (var i = 0; i < collection.Count; i++)
            {
                UnderlyingType.Write(writer, collection[i]);
            }
        }
        public override void WriteFull(ExtendedBinaryWriter binaryWriter)
        {
            const int commandCount = 1;

            binaryWriter.Write7BitEncodedInt(commandCount);
            Command resetCommand = Command.FromReset(Reference.ToList());

            resetCommand.Write(binaryWriter, _keySerializer, _valueSerializer);
            _commandsInvalidated = false;
        }
示例#12
0
        internal byte[] WriteFull()
        {
            using var memoryStream = new MemoryStream();
            using var writer       = new ExtendedBinaryWriter(memoryStream);

            // Write remove reference count 0
            writer.Write7BitEncodedInt(0);

            List <SyncSource> syncSourceObjects = _referencePool.SyncObjects.ToList();

            writer.Write7BitEncodedInt(syncSourceObjects.Count);
            foreach (SyncSource syncSourceObject in syncSourceObjects)
            {
                writer.Write7BitEncodedInt(syncSourceObject.ReferenceId);
                Settings.TypeEncoder.WriteType(syncSourceObject.BaseObject.GetType(), writer);
                syncSourceObject.WriteFull(writer);
            }

            return(new SynchronizationPacket(memoryStream.ToArray()).SetTick(0));
        }
        public override void WriteFull(ExtendedBinaryWriter binaryWriter)
        {
            var arrayRanks = Reference.GetType().GetArrayRank();
            var lengths    = new int[arrayRanks];

            binaryWriter.Write7BitEncodedInt(arrayRanks);
            for (int rank = 0; rank < arrayRanks; rank++)
            {
                int length = Reference.GetLength(rank);
                lengths[rank] = length;
                binaryWriter.Write7BitEncodedInt(length);
            }
            int[] zIndex = new int[arrayRanks];
            void TraverseArray(int depth)
            {
                int length = lengths[depth];

                if (depth + 1 < arrayRanks)
                {
                    for (int i = 0; i < length; i++)
                    {
                        zIndex[depth] = i;
                        TraverseArray(depth + 1);
                    }
                }
                else
                {
                    for (int i = 0; i < length; i++)
                    {
                        zIndex[depth] = i;
                        _elementSerializer.Write(Reference.GetValue(zIndex), binaryWriter);
                    }
                }
            }

            TraverseArray(0);
        }
示例#14
0
        /// <summary>
        /// Writes all of the nodes contained in this list to the underlying stream, prefixed
        /// by the number of elements encoded using LEB128 encoding.
        /// </summary>
        /// <param name="writer">Writer used for writing to the underlying stream.</param>
        public override void WriteValue(ExtendedBinaryWriter writer)
        {
            writer.Write7BitEncodedInt(_list.Count);

            foreach (var node in _list)
            {
                if (node == null)
                {
                    writer.Write((byte)BsfType.Null);
                }
                else
                {
                    node.WriteType(writer);
                    node.WriteValue(writer);
                }
            }
        }
示例#15
0
 public override void WriteChanges(ExtendedBinaryWriter binaryWriter)
 {
     // A full reset if the underlying dictionary is cleared
     if (_commandsInvalidated)
     {
         WriteFull(binaryWriter);
     }
     else
     {
         binaryWriter.Write7BitEncodedInt(_commands.Count);
         foreach (Command command in _commands)
         {
             command.Write(binaryWriter, _keySerializer);
         }
         _commands.Clear();
     }
 }
示例#16
0
        public int GetTextDictionaryKey(string text)
        {
            if (text == null)
            {
                return(0);
            }

            lock (_textDictionary)
            {
                if (!_textDictionary.TryGetValue(text, out var key))
                {
                    key = _textDictionary.Count + 1;
                    _textDictionary.Add(text, key);

                    if (_currentDictionaryWriter == null)
                    {
                        _currentDictionaryWriter = new ExtendedBinaryWriter(new MemoryStream(), Encoding.UTF8);
                    }

                    _currentDictionaryWriter.Write((byte)DiagnosticsEventKind.TextDictionaryKeyAdded);
                    var eventDataLengthPos = (int)_currentDictionaryWriter.BaseStream.Position;
                    _currentDictionaryWriter.Write(0);
                    var startPos = (int)_currentDictionaryWriter.BaseStream.Position;

                    _currentDictionaryWriter.Write7BitEncodedInt(key);
                    _currentDictionaryWriter.WriteNullable(text);

                    var endPos = (int)_currentDictionaryWriter.BaseStream.Position;
                    _currentDictionaryWriter.Seek(eventDataLengthPos, SeekOrigin.Begin);
                    _currentDictionaryWriter.Write(endPos - startPos);
                    _currentDictionaryWriter.Seek(endPos, SeekOrigin.Begin);
                }

                return(key);
            }
        }
        public void Write(object value, ExtendedBinaryWriter writer)
        {
            var referenceIdentifier = _identifierResolver.ResolveIdentifier(value);

            writer.Write7BitEncodedInt(referenceIdentifier);
        }
        public void Serialize(object value, ExtendedBinaryWriter writer)
        {
            int referenceIdentifier = _referenceResolver.ResolveIdentifier(value);

            writer.Write7BitEncodedInt(referenceIdentifier);
        }