Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
5dba7d7b
Commit
5dba7d7b
authored
Jan 06, 2016
by
Jon Skeet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Introduce ICustomDiagnosticMessage to allow for custom string formatting
This fixes issue #933, effectively.
parent
73c003c3
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
142 additions
and
1 deletion
+142
-1
GeneratedMessageTest.cs
csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+16
-0
Google.Protobuf.Test.csproj
csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+1
-0
JsonParserTest.cs
csharp/src/Google.Protobuf.Test/JsonParserTest.cs
+1
-1
ForeignMessagePartial.cs
.../Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs
+45
-0
Google.Protobuf.csproj
csharp/src/Google.Protobuf/Google.Protobuf.csproj
+1
-0
ICustomDiagnosticMessage.cs
csharp/src/Google.Protobuf/ICustomDiagnosticMessage.cs
+69
-0
JsonFormatter.cs
csharp/src/Google.Protobuf/JsonFormatter.cs
+9
-0
No files found.
csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
View file @
5dba7d7b
...
...
@@ -695,5 +695,21 @@ namespace Google.Protobuf
var
parsed
=
TestAllTypes
.
Parser
.
ParseFrom
(
stream
);
Assert
.
AreEqual
(
new
TestAllTypes
{
SingleFixed32
=
123
},
parsed
);
}
[
Test
]
public
void
CustomDiagnosticMessage_DirectToStringCall
()
{
var
message
=
new
ForeignMessage
{
C
=
31
};
Assert
.
AreEqual
(
"{ \"c\": 31, \"@cInHex\": \"1f\" }"
,
message
.
ToString
());
Assert
.
AreEqual
(
"{ \"c\": 31 }"
,
JsonFormatter
.
Default
.
Format
(
message
));
}
[
Test
]
public
void
CustomDiagnosticMessage_Nested
()
{
var
message
=
new
TestAllTypes
{
SingleForeignMessage
=
new
ForeignMessage
{
C
=
16
}
};
Assert
.
AreEqual
(
"{ \"singleForeignMessage\": { \"c\": 16, \"@cInHex\": \"10\" } }"
,
message
.
ToString
());
Assert
.
AreEqual
(
"{ \"singleForeignMessage\": { \"c\": 16 } }"
,
JsonFormatter
.
Default
.
Format
(
message
));
}
}
}
csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
View file @
5dba7d7b
...
...
@@ -102,6 +102,7 @@
<Compile
Include=
"Reflection\TypeRegistryTest.cs"
/>
<Compile
Include=
"SampleEnum.cs"
/>
<Compile
Include=
"SampleMessages.cs"
/>
<Compile
Include=
"TestProtos\ForeignMessagePartial.cs"
/>
<Compile
Include=
"TestProtos\MapUnittestProto3.cs"
/>
<Compile
Include=
"TestProtos\UnittestImportProto3.cs"
/>
<Compile
Include=
"TestProtos\UnittestImportPublicProto3.cs"
/>
...
...
csharp/src/Google.Protobuf.Test/JsonParserTest.cs
View file @
5dba7d7b
...
...
@@ -182,7 +182,7 @@ namespace Google.Protobuf
private
static
void
AssertRoundtrip
<
T
>(
T
message
)
where
T
:
IMessage
<
T
>,
new
()
{
var
clone
=
message
.
Clone
();
var
json
=
message
.
ToString
(
);
var
json
=
JsonFormatter
.
Default
.
Format
(
message
);
var
parsed
=
JsonParser
.
Default
.
Parse
<
T
>(
json
);
Assert
.
AreEqual
(
clone
,
parsed
);
}
...
...
csharp/src/Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs
0 → 100644
View file @
5dba7d7b
#
region
Copyright
notice
and
license
// Protocol Buffers - Google's data interchange format
// Copyright 2016 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
namespace
Google.Protobuf.TestProtos
{
/// <summary>
/// A message with custom diagnostics (to test that they work).
/// </summary>
public
partial
class
ForeignMessage
:
ICustomDiagnosticMessage
{
public
string
ToDiagnosticString
()
{
return
$"
{{
\
"c\": {C}, \"@cInHex\": \"{C:x}\" }}"
;
}
}
}
csharp/src/Google.Protobuf/Google.Protobuf.csproj
View file @
5dba7d7b
...
...
@@ -85,6 +85,7 @@
<Compile
Include=
"Compatibility\TypeExtensions.cs"
/>
<Compile
Include=
"FieldCodec.cs"
/>
<Compile
Include=
"FrameworkPortability.cs"
/>
<Compile
Include=
"ICustomDiagnosticMessage.cs"
/>
<Compile
Include=
"IDeepCloneable.cs"
/>
<Compile
Include=
"InvalidJsonException.cs"
/>
<Compile
Include=
"JsonFormatter.cs"
/>
...
...
csharp/src/Google.Protobuf/ICustomDiagnosticMessage.cs
0 → 100644
View file @
5dba7d7b
#
region
Copyright
notice
and
license
// Protocol Buffers - Google's data interchange format
// Copyright 2016 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
namespace
Google.Protobuf
{
/// <summary>
/// A message type that has a custom string format for diagnostic purposes.
/// </summary>
/// <remarks>
/// <para>
/// Calling <see cref="object.ToString"/> on a generated message type normally
/// returns the JSON representation. If a message type implements this interface,
/// then the <see cref="ToDiagnosticString"/> method will be called instead of the regular
/// JSON formatting code, but only when <c>ToString()</c> is called either on the message itself
/// or on another message which contains it. This does not affect the normal JSON formatting of
/// the message.
/// </para>
/// <para>
/// For example, if you create a proto message representing a GUID, the internal
/// representation may be a <c>bytes</c> field or four <c>fixed32</c> fields. However, when debugging
/// it may be more convenient to see a result in the same format as <see cref="System.Guid"/> provides.
/// </para>
/// <para>This interface extends <see cref="IMessage"/> to avoid it accidentally being implemented
/// on types other than messages, where it would not be used by anything in the framework.</para>
/// </remarks>
public
interface
ICustomDiagnosticMessage
:
IMessage
{
/// <summary>
/// Returns a string representation of this object, for diagnostic purposes.
/// </summary>
/// <remarks>
/// This method is called when a message is formatted as part of a <see cref="object.ToString"/>
/// call. It does not affect the JSON representation used by <see cref="JsonFormatter"/> other than
/// in calls to <see cref="JsonFormatter.ToDiagnosticString(IMessage)"/>. While it is recommended
/// that the result is valid JSON, this is never assumed by the Protobuf library.
/// </remarks>
/// <returns>A string representation of this object, for diagnostic purposes.</returns>
string
ToDiagnosticString
();
}
}
csharp/src/Google.Protobuf/JsonFormatter.cs
View file @
5dba7d7b
...
...
@@ -181,6 +181,15 @@ namespace Google.Protobuf
WriteNull
(
builder
);
return
;
}
if
(
ReferenceEquals
(
this
,
diagnosticFormatter
))
{
ICustomDiagnosticMessage
customDiagnosticMessage
=
message
as
ICustomDiagnosticMessage
;
if
(
customDiagnosticMessage
!=
null
)
{
builder
.
Append
(
customDiagnosticMessage
.
ToDiagnosticString
());
return
;
}
}
builder
.
Append
(
"{ "
);
bool
writtenFields
=
WriteMessageFields
(
builder
,
message
,
false
);
builder
.
Append
(
writtenFields
?
" }"
:
"}"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment