Re: Getting a byte array from a generic class
Eddie Lascu <[email protected]> Tue, 18 May 2010 12:31:00 -0400
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <8CB0EFF82F198A4B914324DD435718C217DFDA4881@STO000000XSC0.IBIGROUP.COM> |
The problem is not bandwidth, as I would not have to serialize a ton of obj= ects, but the actual size. These objects are wrapped in SNMP packets and se= nt down to field devices (dynamic message signs, speed detectors, traffic c= ontrollers, etc.). A field device will expect an integer to arrive encoded = in 4 bytes, not 8. Binary serialization doesn't work for the exact same rea= son - the overhead bytes will be interpreted by something else and will con= fuse the field device. Thanks anyway for your suggestions. Regards, Eddie -----Original Message----- From: Discussion of advanced .NET topics. [mailto:[email protected]= E.LSOFT.COM] On Behalf Of Steve Johnson Sent: Tuesday, May 18, 2010 12:24 PM To: [email protected] Subject: Re: [ADVANCED-DOTNET] Getting a byte array from a generic class Some other ideas, but they have issues: 1 - You could use binary serialization, but that would have a bunch of overhead. 2 - Since you will only be supporting numeric primitives, you could do the following, but it would be slow and require boxing. public byte[] AsByteArray() { double d =3D (double)Convert.ChangeType(_value, typeof(double)); return BitConverter.GetBytes(d); } public void FromByteArray(byte[] bytes) { double d =3D BitConverter.ToDouble(bytes, 0); _value =3D (T)Convert.ChangeType(d, typeof(T)); } This would also require 8 bytes for any value, which would be bad if bandwidth is an issue. -- Steve Johnson On Tue, May 18, 2010 at 10:54 AM, Eddie Lascu <[email protected]> wrote: > Hi there, > > I need to pick your brains with regard to a more elegant solution to a > problem I'm dealing with right now. I have a generic class that wraps any > type of numeric values (short, int, decimal, double or float). Removing t= he > parts that are not interesting, this class is something like this: > > public abstract class NumericNtcipObject<T> where T : struct, > IComparable<T> > { > protected NumericNtcipObject(T value) > { > double val; > Debugging.Assert(typeof(T).IsValueType && > typeof(T).IsPrimitive); > Debugging.Assert(double.TryParse(value.ToString(), out val)); > > Value =3D value; > } > > public T Value > { > set > { > _value =3D value; > } > } > > public byte[] ValueAsByteStream > { > get > { > // Need help here > } > } > > protected T _value; > } > > The class will be derived from and will only be instantiated with numeric > values. I want to create a property that can give me a byte array contain= ing > all the bytes of the underlying value. If this would not be a generic cla= ss, > I could do: > > return BitConverter.GetBytes(Value); > > Unfortunately, BitConverter.GetBytes cannot resolve the type of Value so > this solution goes out the window. I need the exact number of bytes, so > casting to a type with a larger range is not good. > > I can do something like this: > > > public byte[] ValueAsByteStream > { > get > { > if(typeof(T) =3D=3D typeof(Int16)) > { > return BitConverter.GetBytes(Value.ToInt16(new > NumberFormatInfo())); > } > > if (typeof(T) =3D=3D typeof(Int32)) > { > return BitConverter.GetBytes(Value.ToInt32(new > NumberFormatInfo())); > } > > if (typeof(T) =3D=3D typeof(Int64)) > { > return BitConverter.GetBytes(Value.ToInt64(new > NumberFormatInfo())); > } > > if (typeof(T) =3D=3D typeof(UInt16)) > { > return BitConverter.GetBytes(Value.ToUInt16(new > NumberFormatInfo())); > } > > if (typeof(T) =3D=3D typeof(UInt32)) > { > return BitConverter.GetBytes(Value.ToUInt32(new > NumberFormatInfo())); > } > > if (typeof(T) =3D=3D typeof(UInt64)) > { > return BitConverter.GetBytes(Value.ToUInt64(new > NumberFormatInfo())); > } > // rest of types here > > return null; > } > } > > but this is not very nice. > > Can either of you smart guys give me a brilliant idea here? > > Thanks in advance, > Eddie > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D View archives and manage your subscription(s) at http://peach.ease.lsoft.co= m/archives =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives