Avro (Microsoft) Serialization of derived type members missing -
Avro (Microsoft) Serialization of derived type members missing -
i evaluating performance of microsoft's implementation of avro, , @ first thought getting phenomenal performance until realized wasn't serializing entire message ;-)
in next there simple hierarchy of messages decorated [datacontract] (a base of operations , 2 derived types). members decorated [datamember] attribute. create serializer base of operations message type , serialize list of derived messages, appears serialize/deserialize base of operations class members. of derived message members missing result.
am missing something? application require mixed message types.
fwiw don't see strings sec derived type in binary file, suspect derived type members aren't beingness serialized.
thanks, greg class programme { [datacontract(name = "sidetype", namespace = "avromessage")] public enum eventtype { unknown = 0, 1 = 1, 2 = 2 } [datacontract(name = "messagebase", namespace = "avromessage")] public class messagebase { [datamember(name = "subtype")] public string subtype; [datamember(name = "timestamp")] public datetime timestamp; [datamember(name = "groupname")] public string groupname; public override bool equals(object obj) { messagebase other = obj messagebase; if (other == null) homecoming false; homecoming subtype == other.subtype && timestamp == other.timestamp && groupname == other.groupname; } } [datacontract(name = "submessage1", namespace = "avromessage")] public class submessage1 : messagebase { [datamember(name = "volume")] public int volume; [datamember(name = "count")] public int count; [datamember(name = "detectedside")] public eventtype event; public override bool equals(object obj) { submessage1 other = obj submessage1; if (other == null) homecoming false; homecoming subtype == other.subtype && timestamp == other.timestamp && groupname == other.groupname && event == other.event && volume == other.volume && count == other.count; } } [datacontract(name = "submessage2", namespace = "avromessage")] public class submessage2 : messagebase { [datamember(name = "name1")] public string name1; [datamember(name = "volume1")] public int volume1; [datamember(name = "name2")] public string name2; [datamember(name = "volume2")] public int volume2; [datamember(name = "pricemove")] public double pricemove; public override bool equals(object obj) { submessage2 other = obj submessage2; if (other == null) homecoming false; homecoming subtype == other.subtype && timestamp == other.timestamp && groupname == other.groupname && volume1 == other.volume1 && name1 == other.name1 && volume2 == other.volume2 && name2 == other.name2 && pricemove == other.pricemove; } } public class messagefactory { public static ienumerable<messagebase> createmessages(int number) { random ran = new random(); list<messagebase> retval = new list<messagebase>(); (int = 0; < number; i++) { if (ran.next(2) == 0) { submessage1 sub1 = new submessage1(); sub1.timestamp = datetime.now; sub1.groupname = "group" + datetime.now.millisecond.tostring(); sub1.subtype = "submessag1"; sub1.volume = ran.next(10000); sub1.count = ran.next(100); if (ran.next(2) == 0) { sub1.event = eventtype.one; } else { sub1.event = eventtype.two; } retval.add(sub1); } else { submessage2 sub2 = new submessage2(); sub2.timestamp = datetime.now; sub2.groupname = "group" + datetime.now.millisecond.tostring(); sub2.subtype = "submessag2"; sub2.volume1 = ran.next(1000); sub2.pricemove = ran.nextdouble() * 100 - 50; sub2.volume2 = ran.next(1000); sub2.name1 = "contract" + (datetime.now.millisecond + ran.next(5)).tostring(); sub2.name2 = "contract" + datetime.now.millisecond.tostring(); retval.add(sub2); } } homecoming retval; } } public static void testavro(int count) { bool right = false; long serticks = 0; long deserticks = 0; stopwatch sw = new stopwatch(); sw.reset(); var serializer = microsoft.hadoop.avro.avroserializer.create<messagebase>(); messagebase[] messages = new messagebase[count]; using (var file = file.create(@"c:\test_avro.bin")) { int = 0; foreach (var message in messagefactory.createmessages(count)) { messages[i++] = message; sw.start(); serializer.serialize(file, message); sw.stop(); } } serticks = sw.elapsedticks; sw.reset(); list<int> badmessages = new list<int>(); using (var file = file.openread(@"c:\test_avro.bin")) { (int = 0; < count; i++) { sw.start(); messagebase message = serializer.deserialize(file); sw.stop(); submessage1 m1 = message submessage1; submessage2 m2 = message submessage2; bool arenull = (m1 == null) && (m2 == null); // true if (!messages[i].equals(message)) badmessages.add(i); } } deserticks = sw.elapsedticks; right = badmessages.count == 0; long size = (new fileinfo(@"c:\test_proto.bin")).length; console.writeline(string.format("correct: {0}, time out: {1}, , time in: {2}, , size: {3}", correct, serticks, deserticks, size)); } static void main(string[] args) { testavro(10000); console.readline(); } }
my bad - forgot knowntype attribute on base of operations class, 1 each derived type. works if include attributes.
avro
Comments
Post a Comment