Exemplo n.º 1
0
        public void Serialize(IDataConvertor convertor)
        {
            ushort      code;
            List <byte> parameters;

            if (convertor == null)
            {
                code       = 0;
                parameters = null;
            }
            else
            {
                switch (convertor)
                {
                case DataRange data_range:
                    code       = 1;
                    parameters = new List <byte>();
                    parameters.AddRange(BitConverter.GetBytes(data_range.SignalRange));
                    parameters.AddRange(BitConverter.GetBytes(data_range.SignalHeight));
                    // paramter length = 8
                    break;

                case DataRangeDouble data_range_double:
                    code       = 2;
                    parameters = new List <byte>();
                    parameters.AddRange(BitConverter.GetBytes(data_range_double.SignalRange));
                    parameters.AddRange(BitConverter.GetBytes(data_range_double.SignalHeight));
                    // paramter length = 16
                    break;

                default:
                    var attr = GetAttribute(convertor.GetType());
                    if (!registered_functions_via_code.ContainsKey(attr.code | DATA_CONVERTOR_SIGN))
                    {
                        throw new ArgumentException(
                                  nameof(convertor), "this type of IDataConvertor is not registered.");
                    }
                    var serializer = registered_functions_via_code[attr.code | DATA_CONVERTOR_SIGN];
                    code = serializer.Code;
                    var buffer = serializer.Serialize(convertor);
                    if ((buffer?.Length ?? 0) != serializer.ParameterLength)
                    {
                        throw new Exception("invalid parameters' length.");
                    }
                    parameters = new List <byte>();
                    if (buffer != null)
                    {
                        parameters.AddRange(buffer);
                    }
                    break;
                }
            }

            // serialaize type and parameters
            Serialize(code, parameters?.ToArray());
        }