Added convenience methods for to/from xml and json
diff --git a/src/ProtocolBuffers/GeneratedMessage.cs b/src/ProtocolBuffers/GeneratedMessage.cs
index 0ec02e8..d030a17 100644
--- a/src/ProtocolBuffers/GeneratedMessage.cs
+++ b/src/ProtocolBuffers/GeneratedMessage.cs
@@ -50,7 +50,7 @@
     /// </summary>

     public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage<TMessage, TBuilder>

         where TMessage : GeneratedMessage<TMessage, TBuilder>

-        where TBuilder : GeneratedBuilder<TMessage, TBuilder>

+        where TBuilder : GeneratedBuilder<TMessage, TBuilder>, new()

     {

         private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;

 

@@ -175,5 +175,35 @@
         {

             unknownFields = fieldSet;

         }

+

+        public static TMessage ParseFromJson(string jsonText)

+        {

+            return Serialization.JsonFormatReader.CreateInstance(jsonText)

+                .Merge(new TBuilder())

+                .Build();

+        }

+

+        public static TMessage ParseFromJson(System.IO.TextReader reader)

+        { return ParseFromJson(reader, ExtensionRegistry.Empty); }

+

+        public static TMessage ParseFromJson(System.IO.TextReader reader, ExtensionRegistry extensionRegistry)

+        {

+            return Serialization.JsonFormatReader.CreateInstance(reader)

+                .Merge(new TBuilder(), extensionRegistry)

+                .Build();

+        }

+

+        public static TMessage ParseFromXml(System.Xml.XmlReader reader)

+        { return ParseFromXml(Serialization.XmlFormatReader.DefaultRootElementName, reader, ExtensionRegistry.Empty); }

+        

+        public static TMessage ParseFromXml(string rootElementName, System.Xml.XmlReader reader)

+        { return ParseFromXml(rootElementName, reader, ExtensionRegistry.Empty); }

+

+        public static TMessage ParseFromXml(string rootElementName, System.Xml.XmlReader reader, ExtensionRegistry extensionRegistry)

+        {

+            return Serialization.XmlFormatReader.CreateInstance(reader)

+                .Merge(rootElementName, new TBuilder(), extensionRegistry)

+                .Build();

+        }

     }

 }
\ No newline at end of file