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.
30 using System.Reflection;
31 using System.Runtime.Serialization;
33 using Newtonsoft.Json.Tests;
34 using Newtonsoft.Json.Tests.TestObjects;
35 using NUnit.Framework;
36 using Newtonsoft.Json.Linq;
37 using Newtonsoft.Json.Converters;
39 namespace Newtonsoft.Json.Tests.Serialization
41 public class SerializationEventAttributeTests : TestFixtureBase
44 public void ObjectEvents()
46 SerializationEventTestObject obj = new SerializationEventTestObject();
48 Assert.AreEqual(11, obj.Member1);
49 Assert.AreEqual("Hello World!", obj.Member2);
50 Assert.AreEqual("This is a nonserialized value", obj.Member3);
51 Assert.AreEqual(null, obj.Member4);
52 Assert.AreEqual(null, obj.Member5);
54 string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
57 ""Member2"": ""This value went into the data file during serialization."",
61 Assert.AreEqual(11, obj.Member1);
62 Assert.AreEqual("This value was reset after serialization.", obj.Member2);
63 Assert.AreEqual("This is a nonserialized value", obj.Member3);
64 Assert.AreEqual(null, obj.Member4);
65 Assert.AreEqual("Error message for member Member6 = Error getting value from 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
67 JObject o = JObject.Parse(@"{
69 ""Member2"": ""This value went into the data file during serialization."",
72 o["Member6"] = "Dummy text for error";
74 obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(o.ToString());
76 Assert.AreEqual(11, obj.Member1);
77 Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
78 Assert.AreEqual("This value was set during deserialization", obj.Member3);
79 Assert.AreEqual("This value was set after deserialization.", obj.Member4);
80 Assert.AreEqual("Error message for member Member6 = Error setting value to 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
84 public void ObjectWithConstructorEvents()
86 SerializationEventTestObjectWithConstructor obj = new SerializationEventTestObjectWithConstructor(11, "Hello World!", null);
88 Assert.AreEqual(11, obj.Member1);
89 Assert.AreEqual("Hello World!", obj.Member2);
90 Assert.AreEqual("This is a nonserialized value", obj.Member3);
91 Assert.AreEqual(null, obj.Member4);
93 string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
96 ""Member2"": ""This value went into the data file during serialization."",
100 Assert.AreEqual(11, obj.Member1);
101 Assert.AreEqual("This value was reset after serialization.", obj.Member2);
102 Assert.AreEqual("This is a nonserialized value", obj.Member3);
103 Assert.AreEqual(null, obj.Member4);
105 obj = JsonConvert.DeserializeObject<SerializationEventTestObjectWithConstructor>(json);
107 Assert.AreEqual(11, obj.Member1);
108 Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
109 Assert.AreEqual("This value was set during deserialization", obj.Member3);
110 Assert.AreEqual("This value was set after deserialization.", obj.Member4);
114 public void ListEvents()
116 SerializationEventTestList obj = new SerializationEventTestList
121 Convert.ToDecimal(Math.PI)
124 Assert.AreEqual(11, obj.Member1);
125 Assert.AreEqual("Hello World!", obj.Member2);
126 Assert.AreEqual("This is a nonserialized value", obj.Member3);
127 Assert.AreEqual(null, obj.Member4);
129 string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
138 Assert.AreEqual(11, obj.Member1);
139 Assert.AreEqual("This value was reset after serialization.", obj.Member2);
140 Assert.AreEqual("This is a nonserialized value", obj.Member3);
141 Assert.AreEqual(null, obj.Member4);
143 obj = JsonConvert.DeserializeObject<SerializationEventTestList>(json);
145 Assert.AreEqual(11, obj.Member1);
146 Assert.AreEqual("Hello World!", obj.Member2);
147 Assert.AreEqual("This value was set during deserialization", obj.Member3);
148 Assert.AreEqual("This value was set after deserialization.", obj.Member4);
152 public void DictionaryEvents()
154 SerializationEventTestDictionary obj = new SerializationEventTestDictionary
157 { 2.222222222m, "second" },
158 { int.MaxValue, "third" },
159 { Convert.ToDecimal(Math.PI), "fourth" }
162 Assert.AreEqual(11, obj.Member1);
163 Assert.AreEqual("Hello World!", obj.Member2);
164 Assert.AreEqual("This is a nonserialized value", obj.Member3);
165 Assert.AreEqual(null, obj.Member4);
167 string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
170 ""2.222222222"": ""second"",
171 ""2147483647"": ""third"",
172 ""3.14159265358979"": ""fourth"",
173 ""79228162514264337593543950335"": ""Inserted on serializing""
176 Assert.AreEqual(11, obj.Member1);
177 Assert.AreEqual("This value was reset after serialization.", obj.Member2);
178 Assert.AreEqual("This is a nonserialized value", obj.Member3);
179 Assert.AreEqual(null, obj.Member4);
181 obj = JsonConvert.DeserializeObject<SerializationEventTestDictionary>(json);
183 Assert.AreEqual(11, obj.Member1);
184 Assert.AreEqual("Hello World!", obj.Member2);
185 Assert.AreEqual("This value was set during deserialization", obj.Member3);
186 Assert.AreEqual("This value was set after deserialization.", obj.Member4);
190 public void ObjectEventsDocumentationExample()
192 SerializationEventTestObject obj = new SerializationEventTestObject();
194 Console.WriteLine(obj.Member1);
196 Console.WriteLine(obj.Member2);
198 Console.WriteLine(obj.Member3);
199 // This is a nonserialized value
200 Console.WriteLine(obj.Member4);
202 Console.WriteLine(obj.Member5);
205 string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
208 // "Member2": "This value went into the data file during serialization.",
212 Console.WriteLine(obj.Member1);
214 Console.WriteLine(obj.Member2);
215 // This value was reset after serialization.
216 Console.WriteLine(obj.Member3);
217 // This is a nonserialized value
218 Console.WriteLine(obj.Member4);
220 Console.WriteLine(obj.Member5);
221 // Error message for member Member6 = Exception has been thrown by the target of an invocation.
223 obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
225 Console.WriteLine(obj.Member1);
227 Console.WriteLine(obj.Member2);
228 // This value went into the data file during serialization.
229 Console.WriteLine(obj.Member3);
230 // This value was set during deserialization
231 Console.WriteLine(obj.Member4);
232 // This value was set after deserialization.
236 public class SerializationEventContextTestObject
238 public string TestMember { get; set; }
241 internal void OnSerializingMethod(StreamingContext context)
243 TestMember = context.State + " " + context.Context;
248 public void SerializationEventContextTest()
250 SerializationEventContextTestObject value = new SerializationEventContextTestObject();
252 string json = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings
255 new StreamingContext(
256 StreamingContextStates.Remoting,
261 ""TestMember"": ""Remoting ContextValue""