|
@@ -58,15 +58,15 @@ namespace Google.ProtocolBuffers.Serialization
|
|
|
ICodedInputStream codedInput = CreateInputStream(options, contentType, input);
|
|
|
return (TBuilder)builder.WeakMergeFrom(codedInput, options.ExtensionRegistry);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Writes the message instance to the stream using the content type provided
|
|
|
/// </summary>
|
|
|
- /// <param name="message">An instance of a message</param>
|
|
|
/// <param name="options">Options specific to writing this message and/or content type</param>
|
|
|
/// <param name="contentType">The mime type of the content to be written</param>
|
|
|
/// <param name="output">The stream to write the message to</param>
|
|
|
- public static void WriteTo(this IMessageLite message, MessageFormatOptions options, string contentType, Stream output)
|
|
|
+ /// <remarks> If you do not dispose of ICodedOutputStream some formats may yield incomplete output </remarks>
|
|
|
+ public static ICodedOutputStream CreateOutputStream(MessageFormatOptions options, string contentType, Stream output)
|
|
|
{
|
|
|
FormatType outputType = ContentTypeToFormat(contentType, options.DefaultContentType);
|
|
|
|
|
@@ -95,15 +95,15 @@ namespace Google.ProtocolBuffers.Serialization
|
|
|
else
|
|
|
{
|
|
|
XmlWriterSettings settings = new XmlWriterSettings()
|
|
|
- {
|
|
|
- CheckCharacters = false,
|
|
|
- NewLineHandling = NewLineHandling.Entitize,
|
|
|
- OmitXmlDeclaration = true,
|
|
|
- Encoding = Encoding.UTF8,
|
|
|
- Indent = true,
|
|
|
- IndentChars = " ",
|
|
|
- NewLineChars = Environment.NewLine,
|
|
|
- };
|
|
|
+ {
|
|
|
+ CheckCharacters = false,
|
|
|
+ NewLineHandling = NewLineHandling.Entitize,
|
|
|
+ OmitXmlDeclaration = true,
|
|
|
+ Encoding = Encoding.UTF8,
|
|
|
+ Indent = true,
|
|
|
+ IndentChars = " ",
|
|
|
+ NewLineChars = Environment.NewLine,
|
|
|
+ };
|
|
|
writer = XmlFormatWriter.CreateInstance(XmlWriter.Create(output, settings));
|
|
|
}
|
|
|
writer.RootElementName = options.XmlWriterRootElementName;
|
|
@@ -114,12 +114,29 @@ namespace Google.ProtocolBuffers.Serialization
|
|
|
else
|
|
|
throw new NotSupportedException();
|
|
|
|
|
|
- message.WriteTo(codedOutput);
|
|
|
+ return codedOutput;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Writes the message instance to the stream using the content type provided
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="message">An instance of a message</param>
|
|
|
+ /// <param name="options">Options specific to writing this message and/or content type</param>
|
|
|
+ /// <param name="contentType">The mime type of the content to be written</param>
|
|
|
+ /// <param name="output">The stream to write the message to</param>
|
|
|
+ public static void WriteTo(this IMessageLite message, MessageFormatOptions options, string contentType, Stream output)
|
|
|
+ {
|
|
|
+ using (ICodedOutputStream codedOutput = CreateOutputStream(options, contentType, output))
|
|
|
+ {
|
|
|
+ message.WriteTo(codedOutput);
|
|
|
|
|
|
- if (codedOutput is AbstractWriter)
|
|
|
- ((AbstractWriter) codedOutput).EndMessage();
|
|
|
+ // This is effectivly done by Dispose(); however, if you need to finalize a message
|
|
|
+ // without disposing the underlying stream, this is the only way to do it.
|
|
|
+ if (codedOutput is AbstractWriter)
|
|
|
+ ((AbstractWriter)codedOutput).EndMessage();
|
|
|
|
|
|
- codedOutput.Flush();
|
|
|
+ codedOutput.Flush();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|