2
// Copyright (c) 2007 James Newton-King
4
// Permission is hereby granted, free of charge, to any person
5
// obtaining a copy of this software and associated documentation
6
// files (the "Software"), to deal in the Software without
7
// restriction, including without limitation the rights to use,
8
// copy, modify, merge, publish, distribute, sublicense, and/or sell
9
// copies of the Software, and to permit persons to whom the
10
// Software is furnished to do so, subject to the following
13
// The above copyright notice and this permission notice shall be
14
// included in all copies or substantial portions of the Software.
16
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
// OTHER DEALINGS IN THE SOFTWARE.
28
using System.Diagnostics;
30
using System.Reflection;
31
using System.Runtime.Serialization;
32
using Newtonsoft.Json.Serialization;
33
using Newtonsoft.Json.Tests.TestObjects;
35
using NUnit.Framework;
37
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
38
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
39
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
41
using Newtonsoft.Json.Linq;
42
using Newtonsoft.Json.Utilities;
44
namespace Newtonsoft.Json.Tests.Serialization
47
public class SerializationEventAttributeTests : TestFixtureBase
50
public void ObjectEvents()
52
SerializationEventTestObject obj = new SerializationEventTestObject();
54
Assert.AreEqual(11, obj.Member1);
55
Assert.AreEqual("Hello World!", obj.Member2);
56
Assert.AreEqual("This is a nonserialized value", obj.Member3);
57
Assert.AreEqual(null, obj.Member4);
58
Assert.AreEqual(null, obj.Member5);
60
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
63
""Member2"": ""This value went into the data file during serialization."",
67
Assert.AreEqual(11, obj.Member1);
68
Assert.AreEqual("This value was reset after serialization.", obj.Member2);
69
Assert.AreEqual("This is a nonserialized value", obj.Member3);
70
Assert.AreEqual(null, obj.Member4);
71
Assert.AreEqual("Error message for member Member6 = Error getting value from 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
73
JObject o = JObject.Parse(@"{
75
""Member2"": ""This value went into the data file during serialization."",
78
o["Member6"] = "Dummy text for error";
80
obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(o.ToString());
82
Assert.AreEqual(11, obj.Member1);
83
Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
84
Assert.AreEqual("This value was set during deserialization", obj.Member3);
85
Assert.AreEqual("This value was set after deserialization.", obj.Member4);
86
Assert.AreEqual("Error message for member Member6 = Error setting value to 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
90
public void ObjectWithConstructorEvents()
92
SerializationEventTestObjectWithConstructor obj = new SerializationEventTestObjectWithConstructor(11, "Hello World!", null);
94
Assert.AreEqual(11, obj.Member1);
95
Assert.AreEqual("Hello World!", obj.Member2);
96
Assert.AreEqual("This is a nonserialized value", obj.Member3);
97
Assert.AreEqual(null, obj.Member4);
99
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
102
""Member2"": ""This value went into the data file during serialization."",
106
Assert.AreEqual(11, obj.Member1);
107
Assert.AreEqual("This value was reset after serialization.", obj.Member2);
108
Assert.AreEqual("This is a nonserialized value", obj.Member3);
109
Assert.AreEqual(null, obj.Member4);
111
obj = JsonConvert.DeserializeObject<SerializationEventTestObjectWithConstructor>(json);
113
Assert.AreEqual(11, obj.Member1);
114
Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
115
Assert.AreEqual("This value was set during deserialization", obj.Member3);
116
Assert.AreEqual("This value was set after deserialization.", obj.Member4);
120
public void ListEvents()
122
SerializationEventTestList obj = new SerializationEventTestList
127
Convert.ToDecimal(Math.PI)
130
Assert.AreEqual(11, obj.Member1);
131
Assert.AreEqual("Hello World!", obj.Member2);
132
Assert.AreEqual("This is a nonserialized value", obj.Member3);
133
Assert.AreEqual(null, obj.Member4);
135
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
144
Assert.AreEqual(11, obj.Member1);
145
Assert.AreEqual("This value was reset after serialization.", obj.Member2);
146
Assert.AreEqual("This is a nonserialized value", obj.Member3);
147
Assert.AreEqual(null, obj.Member4);
149
obj = JsonConvert.DeserializeObject<SerializationEventTestList>(json);
151
Assert.AreEqual(11, obj.Member1);
152
Assert.AreEqual("Hello World!", obj.Member2);
153
Assert.AreEqual("This value was set during deserialization", obj.Member3);
154
Assert.AreEqual("This value was set after deserialization.", obj.Member4);
158
public void DictionaryEvents()
160
SerializationEventTestDictionary obj = new SerializationEventTestDictionary
163
{ 2.222222222m, "second" },
164
{ int.MaxValue, "third" },
165
{ Convert.ToDecimal(Math.PI), "fourth" }
168
Assert.AreEqual(11, obj.Member1);
169
Assert.AreEqual("Hello World!", obj.Member2);
170
Assert.AreEqual("This is a nonserialized value", obj.Member3);
171
Assert.AreEqual(null, obj.Member4);
173
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
176
""2.222222222"": ""second"",
177
""2147483647"": ""third"",
178
""3.14159265358979"": ""fourth"",
179
""79228162514264337593543950335"": ""Inserted on serializing""
182
Assert.AreEqual(11, obj.Member1);
183
Assert.AreEqual("This value was reset after serialization.", obj.Member2);
184
Assert.AreEqual("This is a nonserialized value", obj.Member3);
185
Assert.AreEqual(null, obj.Member4);
187
obj = JsonConvert.DeserializeObject<SerializationEventTestDictionary>(json);
189
Assert.AreEqual(11, obj.Member1);
190
Assert.AreEqual("Hello World!", obj.Member2);
191
Assert.AreEqual("This value was set during deserialization", obj.Member3);
192
Assert.AreEqual("This value was set after deserialization.", obj.Member4);
196
public void ObjectEventsDocumentationExample()
198
SerializationEventTestObject obj = new SerializationEventTestObject();
200
Console.WriteLine(obj.Member1);
202
Console.WriteLine(obj.Member2);
204
Console.WriteLine(obj.Member3);
205
// This is a nonserialized value
206
Console.WriteLine(obj.Member4);
208
Console.WriteLine(obj.Member5);
211
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
214
// "Member2": "This value went into the data file during serialization.",
218
Console.WriteLine(obj.Member1);
220
Console.WriteLine(obj.Member2);
221
// This value was reset after serialization.
222
Console.WriteLine(obj.Member3);
223
// This is a nonserialized value
224
Console.WriteLine(obj.Member4);
226
Console.WriteLine(obj.Member5);
227
// Error message for member Member6 = Exception has been thrown by the target of an invocation.
229
obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
231
Console.WriteLine(obj.Member1);
233
Console.WriteLine(obj.Member2);
234
// This value went into the data file during serialization.
235
Console.WriteLine(obj.Member3);
236
// This value was set during deserialization
237
Console.WriteLine(obj.Member4);
238
// This value was set after deserialization.
241
public class SerializationEventBaseTestObject
243
public string TestMember { get; set; }
246
internal void OnSerializingMethod(StreamingContext context)
252
public class SerializationEventContextSubClassTestObject : SerializationEventBaseTestObject
257
public void SerializationEventContextTestObjectSubClassTest()
259
SerializationEventContextSubClassTestObject obj = new SerializationEventContextSubClassTestObject();
261
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
263
""TestMember"": ""Set!""
267
#if !SILVERLIGHT && !NETFX_CORE
268
public class SerializationEventContextTestObject
270
public string TestMember { get; set; }
273
internal void OnSerializingMethod(StreamingContext context)
275
TestMember = context.State + " " + context.Context;
280
public void SerializationEventContextTest()
282
SerializationEventContextTestObject value = new SerializationEventContextTestObject();
284
string json = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings
287
new StreamingContext(
288
StreamingContextStates.Remoting,
293
""TestMember"": ""Remoting ContextValue""
298
public void WhenSerializationErrorDetectedBySerializer_ThenCallbackIsCalled()
300
// Verify contract is properly finding our callback
301
var resolver = new DefaultContractResolver().ResolveContract(typeof(FooEvent));
303
Debug.Assert(resolver.OnError != null);
304
Debug.Assert(resolver.OnError == typeof(FooEvent).GetMethod("OnError", BindingFlags.Instance | BindingFlags.NonPublic));
306
var serializer = JsonSerializer.Create(new JsonSerializerSettings
308
// If I don't specify Error here, the callback isn't called
309
// either, but no exception is thrown.
310
MissingMemberHandling = MissingMemberHandling.Error,
313
// This throws with missing member exception, rather than calling my callback.
314
var foo = serializer.Deserialize<FooEvent>(new JsonTextReader(new StringReader("{ Id: 25 }")));
316
// When fixed, this would pass.
317
Debug.Assert(foo.Identifier == 25);
320
public class FooEvent
322
public int Identifier { get; set; }
325
private void OnError(StreamingContext context, ErrorContext error)
327
this.Identifier = 25;
329
// Here we could for example manually copy the
330
// persisted "Id" value into the renamed "Identifier"
332
error.Handled = true;
334
// We never get here :(
335
Console.WriteLine("Error has been fixed");
b'\\ No newline at end of file'