protected object deserializeFromStringByAnotherSerializer(DataEntityFormat format, string entity)
 {
     return(EntitySerializersFactory.GetSerializer(format).DeserializeFromString(format, entity));
 }
 protected string serializeToStringByAnotherSerializer(DataEntityFormat format, object entity)
 {
     return(EntitySerializersFactory.GetSerializer(format).SerializeToString(format, entity));
 }
        protected override object deserialize(DataEntityFormat format, IEnumerable <byte> serialized)
        {
            switch (format)
            {
            case DataEntityFormat.CALIBRATION_PACKET_ENTITIES_ARRAY:
            {
                var entities = new List <CalibrationFileEntity>();
                var data     = serialized.StartEnumeration();
                try
                {
                    while (true)
                    {
                        entities.Add(deserializeOne());
                    }
                }
                catch (InvalidOperationException) { }

                return(entities.ToArray());

                CalibrationFileEntity deserializeOne()
                {
                    var name     = deserializeToCP1251String(data.AdvanceRangeOrThrow().TakeWhile(b => b != 0));
                    var itemType = (ItemTypes)data.AdvanceOrThrow();
                    var dataType = (DataTypes)data.AdvanceOrThrow();
                    var length   = (ushort)EntitySerializersFactory
                                   .GetSerializer(DataEntityFormat.UINT16)
                                   .Deserialize(DataEntityFormat.UINT16, data.Pull(2));
                    var descriptorsData = getData();

                    return(new CalibrationFileEntity(name, itemType, dataType, descriptorsData));

                    object getData()
                    {
                        if (dataType == DataTypes.STRING_CP1251)
                        {
                            return(CP1251_ENCODING.GetString(data.Pull(length)));
                        }
                        else
                        {
                            var size         = dataType.GetSize();
                            var count        = length / size;
                            var dataEntities = new object[count];
                            for (int i = 0; i < count; i++)
                            {
                                switch (dataType)
                                {
                                case DataTypes.INT8:
                                    dataEntities[i] = (sbyte)EntitySerializersFactory
                                                      .GetSerializer(DataEntityFormat.INT8)
                                                      .Deserialize(DataEntityFormat.INT8, data.Pull(size));
                                    break;

                                case DataTypes.INT16:
                                    dataEntities[i] = (short)EntitySerializersFactory
                                                      .GetSerializer(DataEntityFormat.INT16)
                                                      .Deserialize(DataEntityFormat.INT16, data.Pull(size));
                                    break;

                                case DataTypes.UINT16:
                                    dataEntities[i] = (ushort)EntitySerializersFactory
                                                      .GetSerializer(DataEntityFormat.UINT16)
                                                      .Deserialize(DataEntityFormat.UINT16, data.Pull(size));
                                    break;

                                case DataTypes.FLOAT:
                                    var raw = (uint)EntitySerializersFactory
                                              .GetSerializer(DataEntityFormat.UINT32)
                                              .Deserialize(DataEntityFormat.UINT32, data.Pull(size));
                                    dataEntities[i] = BitConverter.ToSingle(BitConverter.GetBytes(raw), 0);
                                    break;

                                default:
                                    throw new NotSupportedException();
                                }
                            }

                            return(dataEntities);
                        }
                    }
                }
            }

            default:
                throw new NotSupportedEnumStateException(typeof(DataEntityFormat), format);
            }

            string deserializeToCP1251String(IEnumerable <byte> bytesSequence)
            {
                var arr = bytesSequence.ToArray();

                return(CommonUtils.TryOrDefault(() => CP1251_ENCODING.GetString(arr), "?".Repeat(arr.Length)));
            }
        }
 protected IEnumerable <byte> serializeByAnotherSerializer(DataEntityFormat format, object entity)
 {
     return(EntitySerializersFactory.GetSerializer(format).Serialize(format, entity));
 }
        protected override IEnumerable <byte> serialize(DataEntityFormat format, object entity)
        {
            switch (format)
            {
            case DataEntityFormat.CALIBRATION_PACKET_ENTITIES_ARRAY:
            {
                var descriptors = (CalibrationFileEntity[])entity;
                return(descriptors.Select(serialize).Flatten());

                IEnumerable <byte> serialize(CalibrationFileEntity descriptor)
                {
                    var descriptorData = new Enumerable <byte>
                    {
                        CP1251_ENCODING.GetBytes(descriptor.Name),
                        0,
                        (byte)descriptor.ItemType,
                        (byte)descriptor.DataType,
                        EntitySerializersFactory
                        .GetSerializer(DataEntityFormat.UINT16)
                        .Serialize(DataEntityFormat.UINT16, (ushort)descriptor.DataLength)
                    };

                    switch (descriptor.DataType)
                    {
                    case DataTypes.INT8:
                    {
                        var bytes = ((Array)descriptor.Data)
                                    .ToEnumerable()
                                    .Select(o => (byte)o)
                                    .ToArray();
                        descriptorData.Add(bytes);
                    }
                    break;

                    case DataTypes.INT16:
                    {
                        var bytes = ((Array)descriptor.Data)
                                    .ToEnumerable()
                                    .Select(o => (short)o)
                                    .Select(v => EntitySerializersFactory.GetSerializer(DataEntityFormat.INT16).Serialize(DataEntityFormat.INT16, (short)v))
                                    .Flatten()
                                    .ToArray();
                        descriptorData.Add(bytes);
                    }
                    break;

                    case DataTypes.UINT16:
                    {
                        var bytes = ((Array)descriptor.Data)
                                    .ToEnumerable()
                                    .Select(o => (ushort)o)
                                    .Select(v => EntitySerializersFactory.GetSerializer(DataEntityFormat.UINT16).Serialize(DataEntityFormat.UINT16, (ushort)v))
                                    .Flatten()
                                    .ToArray();
                        descriptorData.Add(bytes);
                    }
                    break;

                    case DataTypes.FLOAT:
                    {
                        var bytes = ((Array)descriptor.Data)
                                    .ToEnumerable()
                                    .Select(o => (float)o)
                                    .Select(v => BitConverter.ToUInt32(BitConverter.GetBytes(v), 0))
                                    .Select(v => EntitySerializersFactory.GetSerializer(DataEntityFormat.UINT32).Serialize(DataEntityFormat.UINT32, (uint)v))
                                    .Flatten()
                                    .ToArray();
                        descriptorData.Add(bytes);
                    }
                    break;

                    case DataTypes.STRING_CP1251:
                    {
                        var bytes = CP1251_ENCODING.GetBytes((string)descriptor.Data);
                        descriptorData.Add(bytes);
                    }
                    break;

                    default:
                        throw new NotSupportedException();
                    }

                    return(descriptorData);
                }
            }

            default:
                throw new NotSupportedException();
            }
        }