Inheritance: SimpleEntity
        public void RunExpt1()
        {
            // Prepare input entity, we reuse existing init code
            // and just Inject (via Value Injecter library)
            var origMsg = new InheritedEntity();
            origMsg.FillDummyData();
            var origMsgJson = JsonConvert.SerializeObject(origMsg);
            Console.WriteLine("Original object is {0}", origMsgJson);

            // Serialization
            var tmsg = new InheritedEntityThrift();
            tmsg.InjectFrom(origMsg);
            var ms = new MemoryStream();
            var tproto = new TCompactProtocol(new TStreamTransport(ms, ms));
            tmsg.Write(tproto);
            var tbytes = ms.ToArray();

            Console.WriteLine("Serialized to {0} bytes: {1}", tbytes.Length, BitConverter.ToString(tbytes));

            // Deserialization
            var ms2 = new MemoryStream(tbytes);
            var tproto2 = new TCompactProtocol(new TStreamTransport(ms2, ms2));
            var regenTMsg = new InheritedEntityThrift();
            regenTMsg.Read(tproto2);
            var regenMsg = new InheritedEntity();
            regenMsg.InjectFrom(regenTMsg);

            var regenMsgJson = JsonConvert.SerializeObject(regenMsg);
            Console.WriteLine("Regenerated object is {0}", regenMsgJson);
        }
        public void RunExpt1()
        {
            // Quick copy-cat experiment trying to DER encode the InheritedEntity object
            // but by hand here
            var e = new InheritedEntity();
            e.FillDummyData();

            const int iterations = 1000;
            var asn1DerBytes= new byte[0];

            var sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < iterations; i++)
                asn1DerBytes = SerializeAsn1(e);
            sw.Stop();

            // x2 since we're only serializing here, (big) assumption
            // that a ser->deser route will be double, but ok for coarse measures
            var avgMs = sw.Elapsed.TotalMilliseconds*2/iterations;

            File.WriteAllBytes("Asn1Expt.der", asn1DerBytes);
            Console.WriteLine("Serialized via ASN.1 DER encoding to {0} bytes in {1,4:n4} ms: {2}",
                asn1DerBytes.Length,
                avgMs,
                BitConverter.ToString(asn1DerBytes));
        }
        public byte[] SerializeAvroMsft(InheritedEntity thisObj)
        {
            var serializer = new AvroSerializer(thisObj.GetType());

            using (var ms = new MemoryStream())
            {
                serializer.Serialize(thisObj, ms);
                return ms.ToArray();
            }
        }
        private static byte[] SerializeAsn1(InheritedEntity e)
        {
            using (var ms = new MemoryStream())
            {
                var s = new DerSequenceGenerator(ms, 1, false);
                s.AddObject(new DerPrintableString(e.Message));
                s.AddObject(new DerPrintableString(e.FunctionCall));
                s.AddObject(new DerPrintableString(e.Parameters));
                s.AddObject(new DerPrintableString(e.Name));
                s.AddObject(new DerInteger(e.EmployeeId));

                var floatBytes = BitConverter.GetBytes(e.RaiseRate);
                    // unable to find API to write floats, hacking away :/
                s.AddObject(new DerOctetString(floatBytes));

                s.AddObject(new DerPrintableString(e.AddressLine1));
                s.AddObject(new DerPrintableString(e.AddressLine2));
                s.AddObject(new DerOctetString(e.Icon));
                s.AddObject(new DerOctetString(e.LargeIcon));
                s.Close();

                return ms.ToArray();
            }
        }
        static void RunTests()
        {
            // Pick an entity type
            //var originalObject = new SimpleEntity();
            var originalObject = new InheritedEntity();
            originalObject.FillDummyData();
            Test = new Test<InheritedEntity>();
            //Test = new Test<SimpleEntity>();

            Results = Test.RunTests(originalObject, NumOfObjects);
        }
        private void AvroMsftToAvro()
        {
            // avro-msft ser => avro deser

            var e = new InheritedEntity();
            e.FillDummyData();

            // Avro MSFT serialize
            var eBytes = SerializeAvroMsft(e);

            // Avro-Apache deserialize
            var eCodeGenEntity = DeserializeAvro(eBytes);
            var eAppEntityRegen = new InheritedEntity();
            eAppEntityRegen.InjectFrom(eCodeGenEntity);

            // Compare the object (in JSON, easiest to do so)
            var eJson = JsonConvert.SerializeObject(e);
            var eRegenJson = JsonConvert.SerializeObject(eAppEntityRegen);

            Console.Write("avro-msft ser => avro deser ");
            if (eJson != eRegenJson)
                Console.WriteLine("FAILED !!!");
            else
                Console.WriteLine("passed");
        }