> > > I need to rewrite this class whenever schema is modified which I prefer > to avoid.
And if I provided a custom serialization API, you'd need to maintain *that *when your schema changes, with the additional overhead that you'd have to worry about some protobuf knowledge too. Or (perhaps more likely) I'd need to spend quite some time devising a custom serializer API that is usable without needing to know too much about the actual wire spec. Another way of looking it is: your DTO model changes will *probably* be relatively uncommon and pretty simple additions of new members (otherwise you have other problems); the maintenance to add support for an extra member should be minimal. tl;dr; a custom serialization API is something I can look at *at some point*, but it is not at the top of my list. And I'm still not convinced it is desirable or advantageous, so *looking at it* isn't a guarantee of *implementing it.* Marc On 2 August 2012 05:06, Shail <shailendranalw...@gmail.com> wrote: > Thanks Marc for Solution as well as detail explanation with test code. I > really appreciate your support and effort. > > But in my context, as I mentioned above "Param" class is auto generated.So > if I write ParamSurrogate , I need to rewrite this class whenever schema > is modified which I prefer to avoid. > > Just wanted to know, like XML custom serialization,Is it feasible to > write custom serialization for ProtoBuffer? > > > Regards > Shailendra > > On Wednesday, 1 August 2012 12:58:26 UTC+5:30, Marc Gravell wrote: >> >> Firstly, I must emphasise that everything here relates to protobuf-net, >> not to the more general "protobuf" implementations. >> >> Yes, that is doable, via a combination of configuration at runtime, and a >> "surrogate". >> >> Firstly: what is a "surrogate" here: well, the layout of Param, with >> "object" etc, is not very protobuf-net friendly, so protobuf-net allows you >> to write a separate, more-suitable-for-**serialization type, and flip >> between them at will. To do this, protobuf-net uses the .NET conversion >> operators (implicit or explicit), for example: >> >> [ProtoContract] >> public class ParamSurrogate >> { >> [ProtoMember(1)] >> public FloatData FloatData { get; set; } >> // TODO: other types here >> >> public static implicit operator ParamSurrogate(Param value) >> { >> if (value == null) return null; >> var surrogate = new ParamSurrogate(); >> if(value.Item != null) >> { >> surrogate.FloatData = value.Item as FloatData; // >> will be null if not this >> // TODO: other types here >> } >> return surrogate; >> } >> public static implicit operator Param(ParamSurrogate value) >> { >> if (value == null) return null; >> var param = new Param(); >> if (value.FloatData != null) param.Item = value.FloatData; >> // TODO: other types here >> return param; >> } >> } >> >> Note that for convenience I'm using attributes to describe the >> protobuf-net options for the surrogate, but that could also be avoided if >> necessary. Note that we also need to tell protobuf-net to *use* that >> surrogate whenever it sees a Param, which can be done via: >> >> // configure model (do once at app startup) >> var model = RuntimeTypeModel.Default; >> model.Add(typeof(Param), false).SetSurrogate(typeof(** >> ParamSurrogate)); >> >> Now, the FloatData is not actually too problematic - simple values are >> arrays are fine. All we need to do is tell it about the members we want to >> serialize, and which keys to use. This is as simple as (continuing that >> initial configuration): >> >> model.Add(typeof (FloatData), false).Add("Ranges", >> "AdjustValue", "Values"); >> //TODO: other types here >> >> which gives the 3 members the keys 1, 2, 3 respectively. >> >> We can test this: >> >> // test data >> var param = new Param >> { >> Item = new FloatData >> { >> AdjustValue = 123.45F, >> Ranges = new float[] { 1.0F, 2.4F }, >> Values = new float[] { 7.21F, 19.2F } >> } >> }; >> // note the fallowing is the same as Serializer.DeepClone, >> since >> // model === RuntimeTypeModel.Default >> var clone = (Param) model.DeepClone(param); >> Assert.AreNotSame(clone, param, "Different instance"); >> Assert.IsInstanceOfType(**typeof(FloatData), clone.Item, >> "Data type"); >> var data = (FloatData) clone.Item; >> Assert.AreEqual(123.45F, data.AdjustValue); >> Assert.AreEqual(2, data.Ranges.Length); >> Assert.AreEqual(1.0F, data.Ranges[0]); >> Assert.AreEqual(2.4F, data.Ranges[1]); >> Assert.AreEqual(2, data.Values.Length); >> Assert.AreEqual(7.21F, data.Values[0]); >> Assert.AreEqual(19.2F, data.Values[1]); >> >> Which all works fine, demonstrating that we have serialized and >> deserialized the data correctly. >> >> Marc >> >> >> >> On 1 August 2012 07:52, Shail <shailendranalw...@gmail.com> wrote: >> >>> Hi Marc, >>> Here FloatData, StringData,IntData,Int64Data,**CompositeData are custom >>> classes like below is the defination of FloatData class: >>> >>> public class FloatData >>> { >>> >>> /// <remarks/> >>> [System.Xml.Serialization.**XmlArrayItemAttribute("item", >>> IsNullable = false)] >>> public float[] Ranges; >>> >>> /// <remarks/> >>> [System.Xml.Serialization.**XmlAttributeAttribute()] >>> public System.Single AdjustValue; >>> >>> >>> /// <remarks/> >>> [System.Xml.Serialization.**XmlAttributeAttribute()] >>> public System.Single[] Values; >>> } >>> >>> Regards >>> Shailendra >>> >>> On Wednesday, 1 August 2012 11:51:01 UTC+5:30, Marc Gravell wrote: >>>> >>>> And in this model, what is FloatData, StringData, IntData, etc? >>>> >>>> This is certainly solvable with protobuf-net, but to do a complete >>>> example I'd need to see those additional types. >>>> >>>> Marc >>>> (protobuf-net) >>>> >>>> On 31 July 2012 14:14, Shail <shailendranalw...@gmail.com> wrote: >>>> >>>>> public class Param >>>>> { >>>>> >>>>> /// <remarks/> >>>>> [System.Xml.Serialization.**XmlE**lementAttribute("**FloatData", >>>>> typeof(FloatData))] >>>>> [System.Xml.Serialization.**XmlE**lementAttribute("**StringData", >>>>> typeof(StringData))] >>>>> [System.Xml.Serialization.**XmlE**lementAttribute("IntData", >>>>> typeof(IntData))] >>>>> [System.Xml.Serialization.**XmlE**lementAttribute("**Int64Data", >>>>> typeof(Int64Data))] >>>>> [System.Xml.Serialization.**XmlE**lementAttribute("** >>>>> CompositeData**", typeof(CompositeData))] >>>>> *public object Item;* >>>>> ..... >>>>> .... >>>>> } >>>>> >>>> >>>> >>>> >>>> -- >>>> Regards, >>>> >>>> Marc >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Protocol Buffers" group. >>> To view this discussion on the web visit https://groups.google.com/d/** >>> msg/protobuf/-/g3dGIhKUYkoJ<https://groups.google.com/d/msg/protobuf/-/g3dGIhKUYkoJ> >>> . >>> >>> To post to this group, send email to protobuf@googlegroups.com. >>> To unsubscribe from this group, send email to protobuf+unsubscribe@** >>> googlegroups.com <protobuf%2bunsubscr...@googlegroups.com>. >>> For more options, visit this group at http://groups.google.com/** >>> group/protobuf?hl=en <http://groups.google.com/group/protobuf?hl=en>. >>> >> >> >> >> -- >> Regards, >> >> Marc >> > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/protobuf/-/CfwLilmgOtUJ. > > To post to this group, send email to protobuf@googlegroups.com. > To unsubscribe from this group, send email to > protobuf+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/protobuf?hl=en. > -- Regards, Marc -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.