Xamarin Public Jenkins f3e3aab35a Imported Upstream version 4.3.2.467
Former-commit-id: 9c2cb47f45fa221e661ab616387c9cda183f283d
2016-02-22 11:00:01 -05:00

2813 lines
76 KiB
C#

//
// DataContractJsonSerializerTest.cs
//
// Author:
// Atsushi Enomoto <atsushi@ximian.com>
// Ankit Jain <JAnkit@novell.com>
// Antoine Cailliau <antoinecailliau@gmail.com>
//
// Copyright (C) 2005-2007 Novell, Inc. http://www.novell.com
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//
// This test code contains tests for DataContractJsonSerializer, which is
// imported from DataContractSerializerTest.cs.
//
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Xml;
using NUnit.Framework;
namespace MonoTests.System.Runtime.Serialization.Json
{
[TestFixture]
public class DataContractJsonSerializerTest
{
static readonly XmlWriterSettings settings;
static DataContractJsonSerializerTest ()
{
settings = new XmlWriterSettings ();
settings.OmitXmlDeclaration = true;
}
[DataContract]
class Sample1
{
[DataMember]
public string Member1;
}
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void ConstructorTypeNull ()
{
new DataContractJsonSerializer (null);
}
[Test]
public void ConstructorKnownTypesNull ()
{
// null knownTypes is allowed.
new DataContractJsonSerializer (typeof (Sample1), (IEnumerable<Type>) null);
new DataContractJsonSerializer (typeof (Sample1), "Foo", null);
}
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void ConstructorNameNull ()
{
new DataContractJsonSerializer (typeof (Sample1), (string) null);
}
[Test]
[ExpectedException (typeof (ArgumentOutOfRangeException))]
public void ConstructorNegativeMaxObjects ()
{
new DataContractJsonSerializer (typeof (Sample1), "Sample1",
null, -1, false, null, false);
}
[Test]
public void ConstructorMisc ()
{
new DataContractJsonSerializer (typeof (JsonGlobalSample1)).WriteObject (new MemoryStream (), new JsonGlobalSample1 ());
}
[Test]
public void WriteObjectContent ()
{
StringWriter sw = new StringWriter ();
using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (string));
xw.WriteStartElement ("my-element");
ser.WriteObjectContent (xw, "TEST STRING");
xw.WriteEndElement ();
}
Assert.AreEqual ("<my-element>TEST STRING</my-element>",
sw.ToString ());
}
// int
[Test]
public void SerializeIntXml ()
{
StringWriter sw = new StringWriter ();
SerializeInt (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">1</root>",
sw.ToString ());
}
[Test]
public void SerializeIntJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeInt (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"1",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeInt (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (int));
using (XmlWriter w = writer) {
ser.WriteObject (w, 1);
}
}
// int, with rootName
[Test]
public void SerializeIntXmlWithRootName ()
{
StringWriter sw = new StringWriter ();
SerializeIntWithRootName (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<myroot type=""number"">1</myroot>",
sw.ToString ());
}
[Test]
// since JsonWriter supports only "root" as the root name, using
// XmlWriter from JsonReaderWriterFactory will always fail with
// an explicit rootName.
[ExpectedException (typeof (SerializationException))]
public void SerializeIntJsonWithRootName ()
{
MemoryStream ms = new MemoryStream ();
SerializeIntWithRootName (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"1",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeIntWithRootName (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (int), "myroot");
using (XmlWriter w = writer) {
ser.WriteObject (w, 1);
}
}
// pass typeof(DCEmpty), serialize int
[Test]
public void SerializeIntForDCEmptyXml ()
{
StringWriter sw = new StringWriter ();
SerializeIntForDCEmpty (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">1</root>",
sw.ToString ());
}
[Test]
public void SerializeIntForDCEmptyJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeIntForDCEmpty (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"1",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeIntForDCEmpty (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (DCEmpty));
using (XmlWriter w = writer) {
ser.WriteObject (w, 1);
}
}
// DCEmpty
[Test]
public void SerializeEmptyClassXml ()
{
StringWriter sw = new StringWriter ();
SerializeEmptyClass (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object"" />",
sw.ToString ());
}
[Test]
public void SerializeEmptyClassJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeEmptyClass (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"{}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeEmptyClass (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (DCEmpty));
using (XmlWriter w = writer) {
ser.WriteObject (w, new DCEmpty ());
}
}
// string (primitive)
[Test]
public void SerializePrimitiveStringXml ()
{
StringWriter sw = new StringWriter ();
SerializePrimitiveString (XmlWriter.Create (sw, settings));
Assert.AreEqual (
"<root>TEST</root>",
sw.ToString ());
}
[Test]
public void SerializePrimitiveStringJson ()
{
MemoryStream ms = new MemoryStream ();
SerializePrimitiveString (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"""TEST""",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializePrimitiveString (XmlWriter writer)
{
XmlObjectSerializer ser =
new DataContractJsonSerializer (typeof (string));
using (XmlWriter w = writer) {
ser.WriteObject (w, "TEST");
}
}
// QName (primitive but ...)
[Test]
public void SerializePrimitiveQNameXml ()
{
StringWriter sw = new StringWriter ();
SerializePrimitiveQName (XmlWriter.Create (sw, settings));
Assert.AreEqual (
"<root>foo:urn:foo</root>",
sw.ToString ());
}
[Test]
public void SerializePrimitiveQNameJson ()
{
MemoryStream ms = new MemoryStream ();
SerializePrimitiveQName (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"""foo:urn:foo""",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializePrimitiveQName (XmlWriter writer)
{
XmlObjectSerializer ser =
new DataContractJsonSerializer (typeof (XmlQualifiedName));
using (XmlWriter w = writer) {
ser.WriteObject (w, new XmlQualifiedName ("foo", "urn:foo"));
}
}
// DBNull (primitive)
[Test]
public void SerializeDBNullXml ()
{
StringWriter sw = new StringWriter ();
SerializeDBNull (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object"" />",
sw.ToString ());
}
[Test]
public void SerializeDBNullJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeDBNull (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"{}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeDBNull (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (DBNull));
using (XmlWriter w = writer) {
ser.WriteObject (w, DBNull.Value);
}
}
// DCSimple1
[Test]
public void SerializeSimpleClass1Xml ()
{
StringWriter sw = new StringWriter ();
SerializeSimpleClass1 (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object""><Foo>TEST</Foo></root>",
sw.ToString ());
}
[Test]
public void SerializeSimpleClass1Json ()
{
MemoryStream ms = new MemoryStream ();
SerializeSimpleClass1 (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"{""Foo"":""TEST""}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeSimpleClass1 (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (DCSimple1));
using (XmlWriter w = writer) {
ser.WriteObject (w, new DCSimple1 ());
}
}
// NonDC
[Test]
// NonDC is not a DataContract type.
public void SerializeNonDCOnlyCtor ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (NonDC));
}
[Test]
//[ExpectedException (typeof (InvalidDataContractException))]
// NonDC is not a DataContract type.
// UPDATE: non-DataContract types are became valid in RTM.
public void SerializeNonDC ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (NonDC));
using (XmlWriter w = XmlWriter.Create (TextWriter.Null, settings)) {
ser.WriteObject (w, new NonDC ());
}
}
// DCHasNonDC
[Test]
//[ExpectedException (typeof (InvalidDataContractException))]
// DCHasNonDC itself is a DataContract type whose field is
// marked as DataMember but its type is not DataContract.
// UPDATE: non-DataContract types are became valid in RTM.
public void SerializeDCHasNonDC ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCHasNonDC));
using (XmlWriter w = XmlWriter.Create (TextWriter.Null, settings)) {
ser.WriteObject (w, new DCHasNonDC ());
}
}
// DCHasSerializable
[Test]
public void SerializeSimpleSerializable1Xml ()
{
StringWriter sw = new StringWriter ();
SerializeSimpleSerializable1 (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object""><Ser type=""object""><Doh>doh!</Doh></Ser></root>",
sw.ToString ());
}
[Test]
public void SerializeSimpleSerializable1Json ()
{
MemoryStream ms = new MemoryStream ();
SerializeSimpleSerializable1 (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"{""Ser"":{""Doh"":""doh!""}}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
// DCHasSerializable itself is DataContract and has a field
// whose type is not contract but serializable.
void SerializeSimpleSerializable1 (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCHasSerializable));
using (XmlWriter w = writer) {
ser.WriteObject (w, new DCHasSerializable ());
}
}
[Test]
public void SerializeDCWithNameXml ()
{
StringWriter sw = new StringWriter ();
SerializeDCWithName (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object""><FooMember>value</FooMember></root>",
sw.ToString ());
}
[Test]
public void SerializeDCWithNameJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeDCWithName (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"{""FooMember"":""value""}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeDCWithName (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithName));
using (XmlWriter w = writer) {
ser.WriteObject (w, new DCWithName ());
}
}
[Test]
public void SerializeDCWithEmptyName1 ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEmptyName));
StringWriter sw = new StringWriter ();
DCWithEmptyName dc = new DCWithEmptyName ();
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
try {
ser.WriteObject (w, dc);
} catch (InvalidDataContractException) {
return;
}
}
Assert.Fail ("Expected InvalidDataContractException");
}
[Test]
public void SerializeDCWithEmptyName2 ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithName));
StringWriter sw = new StringWriter ();
/* DataContractAttribute.Name == "", not valid */
DCWithEmptyName dc = new DCWithEmptyName ();
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
try {
ser.WriteObject (w, dc);
} catch (InvalidDataContractException) {
return;
}
}
Assert.Fail ("Expected InvalidDataContractException");
}
[Test]
[Category("NotWorking")]
public void SerializeDCWithNullName ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithNullName));
StringWriter sw = new StringWriter ();
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
try {
/* DataContractAttribute.Name == "", not valid */
ser.WriteObject (w, new DCWithNullName ());
} catch (InvalidDataContractException) {
return;
}
}
Assert.Fail ("Expected InvalidDataContractException");
}
[Test]
public void SerializeDCWithEmptyNamespace1 ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEmptyNamespace));
StringWriter sw = new StringWriter ();
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
ser.WriteObject (w, new DCWithEmptyNamespace ());
}
}
[Test]
public void SerializeWrappedClassXml ()
{
StringWriter sw = new StringWriter ();
SerializeWrappedClass (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object"" />",
sw.ToString ());
}
[Test]
public void SerializeWrappedClassJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeWrappedClass (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"{}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeWrappedClass (XmlWriter writer)
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (Wrapper.DCWrapped));
using (XmlWriter w = writer) {
ser.WriteObject (w, new Wrapper.DCWrapped ());
}
}
// CollectionContainer : Items must have a setter. (but became valid in RTM).
[Test]
public void SerializeReadOnlyCollectionMember ()
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (CollectionContainer));
StringWriter sw = new StringWriter ();
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
ser.WriteObject (w, null);
}
}
// DataCollectionContainer : Items must have a setter. (but became valid in RTM).
[Test]
public void SerializeReadOnlyDataCollectionMember ()
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (DataCollectionContainer));
StringWriter sw = new StringWriter ();
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
ser.WriteObject (w, null);
}
}
[Test]
[Ignore ("https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=409970")]
[ExpectedException (typeof (SerializationException))]
public void DeserializeReadOnlyDataCollection_NullCollection ()
{
DataContractJsonSerializer ser =
new DataContractJsonSerializer (typeof (CollectionContainer));
StringWriter sw = new StringWriter ();
var c = new CollectionContainer ();
c.Items.Add ("foo");
c.Items.Add ("bar");
using (XmlWriter w = XmlWriter.Create (sw, settings))
ser.WriteObject (w, c);
// CollectionContainer.Items is null, so it cannot deserialize non-null collection.
using (XmlReader r = XmlReader.Create (new StringReader (sw.ToString ())))
c = (CollectionContainer) ser.ReadObject (r);
}
[Test]
public void SerializeGuidXml ()
{
StringWriter sw = new StringWriter ();
SerializeGuid (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root>00000000-0000-0000-0000-000000000000</root>",
sw.ToString ());
}
[Test]
public void SerializeGuidJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeGuid (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"""00000000-0000-0000-0000-000000000000""",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeGuid (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Guid));
using (XmlWriter w = writer) {
ser.WriteObject (w, Guid.Empty);
}
}
[Test]
public void SerializeEnumXml ()
{
StringWriter sw = new StringWriter ();
SerializeEnum (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">0</root>",
sw.ToString ());
}
[Test]
public void SerializeEnumJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeEnum (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"0",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeEnum (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Colors));
using (XmlWriter w = writer) {
ser.WriteObject (w, new Colors ());
}
}
[Test]
public void SerializeEnum2Xml ()
{
StringWriter sw = new StringWriter ();
SerializeEnum2 (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">0</root>",
sw.ToString ());
}
[Test]
public void SerializeEnum2Json ()
{
MemoryStream ms = new MemoryStream ();
SerializeEnum2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"0",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeEnum2 (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Colors));
using (XmlWriter w = writer) {
ser.WriteObject (w, 0);
}
}
[Test] // so, DataContract does not affect here.
public void SerializeEnumWithDCXml ()
{
StringWriter sw = new StringWriter ();
SerializeEnumWithDC (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">0</root>",
sw.ToString ());
}
[Test]
public void SerializeEnumWithDCJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeEnumWithDC (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"0",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeEnumWithDC (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
using (XmlWriter w = writer) {
ser.WriteObject (w, new ColorsWithDC ());
}
}
[Test]
public void SerializeEnumWithNoDCXml ()
{
StringWriter sw = new StringWriter ();
SerializeEnumWithNoDC (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">0</root>",
sw.ToString ());
}
[Test]
public void SerializeEnumWithNoDCJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeEnumWithNoDC (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"0",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeEnumWithNoDC (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsEnumMemberNoDC));
using (XmlWriter w = writer) {
ser.WriteObject (w, new ColorsEnumMemberNoDC ());
}
}
[Test]
public void SerializeEnumWithDC2Xml ()
{
StringWriter sw = new StringWriter ();
SerializeEnumWithDC2 (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""number"">3</root>",
sw.ToString ());
}
[Test]
public void SerializeEnumWithDC2Json ()
{
MemoryStream ms = new MemoryStream ();
SerializeEnumWithDC2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
"3",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeEnumWithDC2 (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
using (XmlWriter w = writer) {
ser.WriteObject (w, 3);
}
}
/*
[Test]
[ExpectedException (typeof (SerializationException))]
public void SerializeEnumWithDCInvalid ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
StringWriter sw = new StringWriter ();
ColorsWithDC cdc = ColorsWithDC.Blue;
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
ser.WriteObject (w, cdc);
}
}
*/
[Test]
public void SerializeDCWithEnumXml ()
{
StringWriter sw = new StringWriter ();
SerializeDCWithEnum (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""object""><_colors type=""number"">0</_colors></root>",
sw.ToString ());
}
[Test]
public void SerializeDCWithEnumJson ()
{
MemoryStream ms = new MemoryStream ();
SerializeDCWithEnum (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"{""_colors"":0}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializeDCWithEnum (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEnum));
using (XmlWriter w = writer) {
ser.WriteObject (w, new DCWithEnum ());
}
}
[Test]
public void SerializerDCArrayXml ()
{
StringWriter sw = new StringWriter ();
SerializerDCArray (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""array""><item type=""object""><_colors type=""number"">0</_colors></item><item type=""object""><_colors type=""number"">1</_colors></item></root>",
sw.ToString ());
}
[Test]
public void SerializerDCArrayJson ()
{
MemoryStream ms = new MemoryStream ();
SerializerDCArray (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"[{""_colors"":0},{""_colors"":1}]",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializerDCArray (XmlWriter writer)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEnum []));
DCWithEnum [] arr = new DCWithEnum [2];
arr [0] = new DCWithEnum (); arr [0].colors = Colors.Red;
arr [1] = new DCWithEnum (); arr [1].colors = Colors.Green;
using (XmlWriter w = writer) {
ser.WriteObject (w, arr);
}
}
[Test]
public void SerializerDCArray2Xml ()
{
StringWriter sw = new StringWriter ();
SerializerDCArray2 (XmlWriter.Create (sw, settings));
Assert.AreEqual (
@"<root type=""array""><item __type=""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"" type=""object""><_colors type=""number"">0</_colors></item><item __type=""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"" type=""object""><Foo>hello</Foo></item></root>",
sw.ToString ());
}
[Test]
public void SerializerDCArray2Json ()
{
MemoryStream ms = new MemoryStream ();
SerializerDCArray2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
Assert.AreEqual (
@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0},{""__type"":""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"",""Foo"":""hello""}]",
Encoding.UTF8.GetString (ms.ToArray ()));
}
void SerializerDCArray2 (XmlWriter writer)
{
List<Type> known = new List<Type> ();
known.Add (typeof (DCWithEnum));
known.Add (typeof (DCSimple1));
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (object []), known);
object [] arr = new object [2];
arr [0] = new DCWithEnum (); ((DCWithEnum)arr [0]).colors = Colors.Red;
arr [1] = new DCSimple1 (); ((DCSimple1) arr [1]).Foo = "hello";
using (XmlWriter w = writer) {
ser.WriteObject (w, arr);
}
}
[Test]
public void SerializerDCArray3Xml ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (int []));
StringWriter sw = new StringWriter ();
int [] arr = new int [2];
arr [0] = 1; arr [1] = 2;
using (XmlWriter w = XmlWriter.Create (sw, settings)) {
ser.WriteObject (w, arr);
}
Assert.AreEqual (
@"<root type=""array""><item type=""number"">1</item><item type=""number"">2</item></root>",
sw.ToString ());
}
[Test]
public void SerializerDCArray3Json ()
{
MemoryStream ms = new MemoryStream ();
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (int []));
int [] arr = new int [2];
arr [0] = 1; arr [1] = 2;
using (XmlWriter w = JsonReaderWriterFactory.CreateJsonWriter (ms)) {
ser.WriteObject (w, arr);
}
Assert.AreEqual (
@"[1,2]",
Encoding.UTF8.GetString (ms.ToArray ()));
}
[Test]
// ... so, non-JSON XmlWriter is still accepted.
public void SerializeNonDCArrayXml ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
StringWriter sw = new StringWriter ();
using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
ser.WriteObject (xw, new SerializeNonDCArrayType ());
}
Assert.AreEqual (@"<root type=""object""><IPAddresses type=""array"" /></root>",
sw.ToString ());
}
[Test]
public void SerializeNonDCArrayJson ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
MemoryStream ms = new MemoryStream ();
using (XmlWriter xw = JsonReaderWriterFactory.CreateJsonWriter (ms)) {
ser.WriteObject (xw, new SerializeNonDCArrayType ());
}
Assert.AreEqual (@"{""IPAddresses"":[]}",
Encoding.UTF8.GetString (ms.ToArray ()));
}
[Test]
public void SerializeNonDCArrayItems ()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
StringWriter sw = new StringWriter ();
using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
SerializeNonDCArrayType obj = new SerializeNonDCArrayType ();
obj.IPAddresses = new NonDCItem [] {new NonDCItem () { Data = new byte [] {1, 2, 3, 4} } };
ser.WriteObject (xw, obj);
}
XmlDocument doc = new XmlDocument ();
doc.LoadXml (sw.ToString ());
XmlNamespaceManager nsmgr = new XmlNamespaceManager (doc.NameTable);
nsmgr.AddNamespace ("s", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization");
nsmgr.AddNamespace ("n", "http://schemas.datacontract.org/2004/07/System.Net");
nsmgr.AddNamespace ("a", "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
Assert.AreEqual (1, doc.SelectNodes ("/root/IPAddresses/item", nsmgr).Count, "#1");
XmlElement el = doc.SelectSingleNode ("/root/IPAddresses/item/Data", nsmgr) as XmlElement;
Assert.IsNotNull (el, "#3");
Assert.AreEqual (4, el.SelectNodes ("item", nsmgr).Count, "#4");
}
[Test]
public void MaxItemsInObjectGraph1 ()
{
// object count == maximum
DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCEmpty), null, 1, false, null, false);
s.WriteObject (XmlWriter.Create (TextWriter.Null), new DCEmpty ());
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void MaxItemsInObjectGraph2 ()
{
// object count > maximum
DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCSimple1), null, 1, false, null, false);
s.WriteObject (XmlWriter.Create (TextWriter.Null), new DCSimple1 ());
}
[Test]
public void DeserializeString ()
{
Assert.AreEqual ("ABC", Deserialize ("\"ABC\"", typeof (string)));
}
[Test]
public void DeserializeInt ()
{
Assert.AreEqual (5, Deserialize ("5", typeof (int)));
}
[Test]
public void DeserializeArray ()
{
int [] ret = (int []) Deserialize ("[5,6,7]", typeof (int []));
Assert.AreEqual (5, ret [0], "#1");
Assert.AreEqual (6, ret [1], "#2");
Assert.AreEqual (7, ret [2], "#3");
}
[Test]
public void DeserializeArrayUntyped ()
{
object [] ret = (object []) Deserialize ("[5,6,7]", typeof (object []));
Assert.AreEqual (5, ret [0], "#1");
Assert.AreEqual (6, ret [1], "#2");
Assert.AreEqual (7, ret [2], "#3");
}
[Test]
public void DeserializeMixedArray ()
{
object [] ret = (object []) Deserialize ("[5,\"6\",false]", typeof (object []));
Assert.AreEqual (5, ret [0], "#1");
Assert.AreEqual ("6", ret [1], "#2");
Assert.AreEqual (false, ret [2], "#3");
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void DeserializeEmptyAsString ()
{
// it somehow expects "root" which should have been already consumed.
Deserialize ("", typeof (string));
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void DeserializeEmptyAsInt ()
{
// it somehow expects "root" which should have been already consumed.
Deserialize ("", typeof (int));
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void DeserializeEmptyAsDBNull ()
{
// it somehow expects "root" which should have been already consumed.
Deserialize ("", typeof (DBNull));
}
[Test]
public void DeserializeEmptyObjectAsString ()
{
// looks like it is converted to ""
Assert.AreEqual (String.Empty, Deserialize ("{}", typeof (string)));
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void DeserializeEmptyObjectAsInt ()
{
Deserialize ("{}", typeof (int));
}
[Test]
public void DeserializeEmptyObjectAsDBNull ()
{
Assert.AreEqual (DBNull.Value, Deserialize ("{}", typeof (DBNull)));
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void DeserializeEnumByName ()
{
// enum is parsed into long
Deserialize (@"""Red""", typeof (Colors));
}
[Test]
public void DeserializeEnum2 ()
{
object o = Deserialize ("0", typeof (Colors));
Assert.AreEqual (typeof (Colors), o.GetType (), "#de3");
Colors c = (Colors) o;
Assert.AreEqual (Colors.Red, c, "#de4");
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void DeserializeEnumInvalid ()
{
Deserialize ("", typeof (Colors));
}
[Test]
[ExpectedException (typeof (SerializationException))]
[Ignore ("NotDotNet")] // 0.0 is an invalid Colors value.
public void DeserializeEnumInvalid3 ()
{
//"0.0" instead of "0"
Deserialize (
"0.0",
typeof (Colors));
}
[Test]
public void DeserializeEnumWithDC ()
{
object o = Deserialize ("0", typeof (ColorsWithDC));
Assert.AreEqual (typeof (ColorsWithDC), o.GetType (), "#de5");
ColorsWithDC cdc = (ColorsWithDC) o;
Assert.AreEqual (ColorsWithDC.Red, o, "#de6");
}
[Test]
[ExpectedException (typeof (SerializationException))]
[Ignore ("NotDotNet")] // 4 is an invalid Colors value.
[Category ("NotWorking")]
public void DeserializeEnumWithDCInvalid ()
{
Deserialize (
"4",
typeof (ColorsWithDC));
}
[Test]
public void DeserializeDCWithEnum ()
{
object o = Deserialize (
"{\"_colors\":0}",
typeof (DCWithEnum));
Assert.AreEqual (typeof (DCWithEnum), o.GetType (), "#de7");
DCWithEnum dc = (DCWithEnum) o;
Assert.AreEqual (Colors.Red, dc.colors, "#de8");
}
[Test]
public void ReadObjectVerifyObjectNameFalse ()
{
string xml = @"<any><Member1>bar</Member1></any>";
object o = new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
.ReadObject (XmlReader.Create (new StringReader (xml)), false);
Assert.IsTrue (o is VerifyObjectNameTestData, "#1");
string xml2 = @"<any><x:Member1 xmlns:x=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">bar</x:Member1></any>";
o = new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
.ReadObject (XmlReader.Create (new StringReader (xml2)), false);
Assert.IsTrue (o is VerifyObjectNameTestData, "#2");
}
[Test]
[ExpectedException (typeof (SerializationException))]
public void ReadObjectVerifyObjectNameTrue ()
{
string xml = @"<any><Member1>bar</Member1></any>";
new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
.ReadObject (XmlReader.Create (new StringReader (xml)), true);
}
[Test] // member name is out of scope
public void ReadObjectVerifyObjectNameTrue2 ()
{
string xml = @"<root><Member2>bar</Member2></root>";
new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
.ReadObject (XmlReader.Create (new StringReader (xml)), true);
}
[Test]
public void ReadTypedObjectJson ()
{
object o = Deserialize (@"{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}", typeof (DCWithEnum));
Assert.AreEqual (typeof (DCWithEnum), o.GetType ());
}
[Test]
public void ReadObjectDCArrayJson ()
{
object o = Deserialize (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}]",
typeof (object []), typeof (DCWithEnum));
Assert.AreEqual (typeof (object []), o.GetType (), "#1");
object [] arr = (object []) o;
Assert.AreEqual (typeof (DCWithEnum), arr [0].GetType (), "#2");
}
[Test]
public void ReadObjectDCArray2Json ()
{
object o = Deserialize (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0},{""__type"":""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"",""Foo"":""hello""}]",
typeof (object []), typeof (DCWithEnum), typeof (DCSimple1));
Assert.AreEqual (typeof (object []), o.GetType (), "#1");
object [] arr = (object []) o;
Assert.AreEqual (typeof (DCWithEnum), arr [0].GetType (), "#2");
Assert.AreEqual (typeof (DCSimple1), arr [1].GetType (), "#3");
}
private object Deserialize (string xml, Type type, params Type [] knownTypes)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer (type, knownTypes);
XmlReader xr = JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (xml), new XmlDictionaryReaderQuotas ());
return ser.ReadObject (xr);
}
public T Deserialize<T>(string json)
{
var bytes = Encoding.Unicode.GetBytes (json);
using (MemoryStream stream = new MemoryStream (bytes)) {
var serializer = new DataContractJsonSerializer (typeof(T));
return (T)serializer.ReadObject (stream);
}
}
[Test]
public void IsStartObject ()
{
DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCSimple1));
Assert.IsTrue (s.IsStartObject (XmlReader.Create (new StringReader ("<root></root>"))), "#1");
Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<dummy></dummy>"))), "#2");
Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<Foo></Foo>"))), "#3");
Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<root xmlns='urn:foo'></root>"))), "#4");
}
[Test]
public void SerializeNonDC2 ()
{
var ser = new DataContractJsonSerializer (typeof (TestData));
StringWriter sw = new StringWriter ();
var obj = new TestData () { Foo = "foo", Bar = "bar", Baz = "baz" };
// XML
using (var xw = XmlWriter.Create (sw))
ser.WriteObject (xw, obj);
var s = sw.ToString ();
// since the order is not preserved, we compare only contents.
Assert.IsTrue (s.IndexOf ("<Foo>foo</Foo>") > 0, "#1-1");
Assert.IsTrue (s.IndexOf ("<Bar>bar</Bar>") > 0, "#1-2");
Assert.IsFalse (s.IndexOf ("<Baz>baz</Baz>") > 0, "#1-3");
// JSON
MemoryStream ms = new MemoryStream ();
using (var xw = JsonReaderWriterFactory.CreateJsonWriter (ms))
ser.WriteObject (ms, obj);
s = new StreamReader (new MemoryStream (ms.ToArray ())).ReadToEnd ().Replace ('"', '/');
// since the order is not preserved, we compare only contents.
Assert.IsTrue (s.IndexOf ("/Foo/:/foo/") > 0, "#2-1");
Assert.IsTrue (s.IndexOf ("/Bar/:/bar/") > 0, "#2-2");
Assert.IsFalse (s.IndexOf ("/Baz/:/baz/") > 0, "#2-3");
}
[Test]
public void AlwaysEmitTypeInformation ()
{
var ms = new MemoryStream ();
var ds = new DataContractJsonSerializer (typeof (string), "root", null, 10, false, null, true);
ds.WriteObject (ms, "foobar");
var s = Encoding.UTF8.GetString (ms.ToArray ());
Assert.AreEqual ("\"foobar\"", s, "#1");
}
[Test]
public void AlwaysEmitTypeInformation2 ()
{
var ms = new MemoryStream ();
var ds = new DataContractJsonSerializer (typeof (TestData), "root", null, 10, false, null, true);
ds.WriteObject (ms, new TestData () { Foo = "foo"});
var s = Encoding.UTF8.GetString (ms.ToArray ());
Assert.AreEqual (@"{""__type"":""TestData:#MonoTests.System.Runtime.Serialization.Json"",""Bar"":null,""Foo"":""foo""}", s, "#1");
}
[Test]
public void AlwaysEmitTypeInformation3 ()
{
var ms = new MemoryStream ();
var ds = new DataContractJsonSerializer (typeof (TestData), "root", null, 10, false, null, false);
ds.WriteObject (ms, new TestData () { Foo = "foo"});
var s = Encoding.UTF8.GetString (ms.ToArray ());
Assert.AreEqual (@"{""Bar"":null,""Foo"":""foo""}", s, "#1");
}
[Test]
public void TestNonpublicDeserialization ()
{
string s1= @"{""Bar"":""bar"", ""Foo"":""foo"", ""Baz"":""baz""}";
TestData o1 = ((TestData)(new DataContractJsonSerializer (typeof (TestData)).ReadObject (JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (s1), new XmlDictionaryReaderQuotas ()))));
Assert.AreEqual (null, o1.Baz, "#1");
string s2 = @"{""TestData"":[{""key"":""key1"",""value"":""value1""}]}";
KeyValueTestData o2 = ((KeyValueTestData)(new DataContractJsonSerializer (typeof (KeyValueTestData)).ReadObject (JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (s2), new XmlDictionaryReaderQuotas ()))));
Assert.AreEqual (1, o2.TestData.Count, "#2");
Assert.AreEqual ("key1", o2.TestData[0].Key, "#3");
Assert.AreEqual ("value1", o2.TestData[0].Value, "#4");
}
// [Test] use this case if you want to check lame silverlight parser behavior. Seealso #549756
public void QuotelessDeserialization ()
{
string s1 = @"{FooMember:""value""}";
var ds = new DataContractJsonSerializer (typeof (DCWithName));
ds.ReadObject (new MemoryStream (Encoding.UTF8.GetBytes (s1)));
string s2 = @"{FooMember:"" \""{dummy:string}\""""}";
ds.ReadObject (new MemoryStream (Encoding.UTF8.GetBytes (s2)));
}
[Test]
[Category ("NotWorking")]
public void TypeIsNotPartsOfKnownTypes ()
{
var dcs = new DataContractSerializer (typeof (string));
Assert.AreEqual (0, dcs.KnownTypes.Count, "KnownTypes #1");
var dcjs = new DataContractJsonSerializer (typeof (string));
Assert.AreEqual (0, dcjs.KnownTypes.Count, "KnownTypes #2");
}
[Test]
public void ReadWriteNullObject ()
{
DataContractJsonSerializer dcjs = new DataContractJsonSerializer (typeof (string));
using (MemoryStream ms = new MemoryStream ()) {
dcjs.WriteObject (ms, null);
ms.Position = 0;
using (StreamReader sr = new StreamReader (ms)) {
string data = sr.ReadToEnd ();
Assert.AreEqual ("null", data, "WriteObject(stream,null)");
ms.Position = 0;
Assert.IsNull (dcjs.ReadObject (ms), "ReadObject(stream)");
}
};
}
object ReadWriteObject (Type type, object obj, string expected)
{
using (MemoryStream ms = new MemoryStream ()) {
DataContractJsonSerializer dcjs = new DataContractJsonSerializer (type);
dcjs.WriteObject (ms, obj);
ms.Position = 0;
using (StreamReader sr = new StreamReader (ms)) {
Assert.AreEqual (expected, sr.ReadToEnd (), "WriteObject");
ms.Position = 0;
return dcjs.ReadObject (ms);
}
}
}
[Test]
[Ignore ("Wrong test case. See bug #573691")]
public void ReadWriteObject_Single_SpecialCases ()
{
Assert.IsTrue (Single.IsNaN ((float) ReadWriteObject (typeof (float), Single.NaN, "NaN")));
Assert.IsTrue (Single.IsNegativeInfinity ((float) ReadWriteObject (typeof (float), Single.NegativeInfinity, "-INF")));
Assert.IsTrue (Single.IsPositiveInfinity ((float) ReadWriteObject (typeof (float), Single.PositiveInfinity, "INF")));
}
[Test]
[Ignore ("Wrong test case. See bug #573691")]
public void ReadWriteObject_Double_SpecialCases ()
{
Assert.IsTrue (Double.IsNaN ((double) ReadWriteObject (typeof (double), Double.NaN, "NaN")));
Assert.IsTrue (Double.IsNegativeInfinity ((double) ReadWriteObject (typeof (double), Double.NegativeInfinity, "-INF")));
Assert.IsTrue (Double.IsPositiveInfinity ((double) ReadWriteObject (typeof (double), Double.PositiveInfinity, "INF")));
}
[Test]
public void ReadWriteDateTime ()
{
var ms = new MemoryStream ();
DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof (Query));
Query query = new Query () {
StartDate = DateTime.SpecifyKind (new DateTime (2010, 3, 4, 5, 6, 7), DateTimeKind.Utc),
EndDate = DateTime.SpecifyKind (new DateTime (2010, 4, 5, 6, 7, 8), DateTimeKind.Utc)
};
serializer.WriteObject (ms, query);
Assert.AreEqual ("{\"StartDate\":\"\\/Date(1267679167000)\\/\",\"EndDate\":\"\\/Date(1270447628000)\\/\"}", Encoding.UTF8.GetString (ms.ToArray ()), "#1");
ms.Position = 0;
Console.WriteLine (new StreamReader (ms).ReadToEnd ());
ms.Position = 0;
var q = (Query) serializer.ReadObject(ms);
Assert.AreEqual (query.StartDate, q.StartDate, "#2");
Assert.AreEqual (query.EndDate, q.EndDate, "#3");
}
[DataContract(Name = "DateTest")]
public class DateTest
{
[DataMember(Name = "should_have_value")]
public DateTime? ShouldHaveValue { get; set; }
}
//
// This tests both the extended format "number-0500" as well
// as the nullable field in the structure
[Test]
public void BugXamarin163 ()
{
string json = @"{""should_have_value"":""\/Date(1277355600000)\/""}";
byte[] bytes = global::System.Text.Encoding.UTF8.GetBytes(json);
Stream inputStream = new MemoryStream(bytes);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DateTest));
DateTest t = serializer.ReadObject(inputStream) as DateTest;
Assert.AreEqual (634129524000000000, t.ShouldHaveValue.Value.Ticks, "#1");
}
[Test]
public void NullableFieldsShouldSupportNullValue ()
{
string json = @"{""should_have_value"":null}";
var inputStream = new MemoryStream (Encoding.UTF8.GetBytes (json));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DateTest));
Console.WriteLine ("# serializer assembly: {0}", serializer.GetType ().Assembly.Location);
DateTest t = serializer.ReadObject (inputStream) as DateTest;
Assert.AreEqual (false, t.ShouldHaveValue.HasValue, "#2");
}
[Test]
public void DeserializeNullMember ()
{
var ds = new DataContractJsonSerializer (typeof (ClassA));
var stream = new MemoryStream ();
var a = new ClassA ();
ds.WriteObject (stream, a);
stream.Position = 0;
a = (ClassA) ds.ReadObject (stream);
Assert.IsNull (a.B, "#1");
}
[Test]
public void OnDeserializationMethods ()
{
var ds = new DataContractJsonSerializer (typeof (GSPlayerListErg));
var obj = new GSPlayerListErg ();
var ms = new MemoryStream ();
ds.WriteObject (ms, obj);
ms.Position = 0;
ds.ReadObject (ms);
Assert.IsTrue (GSPlayerListErg.A, "A");
Assert.IsTrue (GSPlayerListErg.B, "B");
Assert.IsTrue (GSPlayerListErg.C, "C");
}
[Test]
public void WriteChar ()
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof (CharTest));
using (MemoryStream ms = new MemoryStream()) {
serializer.WriteObject(ms, new CharTest ());
ms.Position = 0L;
using (StreamReader reader = new StreamReader(ms)) {
reader.ReadToEnd();
}
}
}
[Test]
public void DictionarySerialization ()
{
var dict = new JsonMyDictionary<string,string> ();
dict.Add ("key", "value");
var serializer = new DataContractJsonSerializer (dict.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, dict);
stream.Position = 0;
Assert.AreEqual ("[{\"Key\":\"key\",\"Value\":\"value\"}]", new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
dict = (JsonMyDictionary<string,string>) serializer.ReadObject (stream);
Assert.AreEqual (1, dict.Count, "#2");
Assert.AreEqual ("value", dict ["key"], "#3");
}
[Test]
public void ExplicitCustomDictionarySerialization ()
{
var dict = new MyExplicitDictionary<string,string> ();
dict.Add ("key", "value");
var serializer = new DataContractJsonSerializer (dict.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, dict);
stream.Position = 0;
Assert.AreEqual ("[{\"Key\":\"key\",\"Value\":\"value\"}]", new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
dict = (MyExplicitDictionary<string,string>) serializer.ReadObject (stream);
Assert.AreEqual (1, dict.Count, "#2");
Assert.AreEqual ("value", dict ["key"], "#3");
}
[Test]
public void Bug13485 ()
{
const string json = "{ \"Name\" : \"Test\", \"Value\" : \"ValueA\" }";
string result = string.Empty;
var serializer = new DataContractJsonSerializer (typeof (Bug13485Type));
Bug13485Type entity;
using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (json)))
entity = (Bug13485Type) serializer.ReadObject (stream);
result = entity.GetValue;
Assert.AreEqual ("ValueA", result, "#1");
}
[DataContract(Name = "UriTest")]
public class UriTest
{
[DataMember(Name = "members")]
public Uri MembersRelativeLink { get; set; }
}
[Test]
public void Bug15169 ()
{
const string json = "{\"members\":\"foo/bar/members\"}";
var serializer = new DataContractJsonSerializer (typeof (UriTest));
UriTest entity;
using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (json)))
entity = (UriTest) serializer.ReadObject (stream);
Assert.AreEqual ("foo/bar/members", entity.MembersRelativeLink.ToString ());
}
#region Test methods for collection serialization
[Test]
public void TestArrayListSerialization ()
{
var collection = new ArrayListContainer ();
var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
var expectedItemsCount = 4;
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
collection = (ArrayListContainer) serializer.ReadObject (stream);
Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestBitArraySerialization ()
{
var collection = new BitArrayContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
public void TestHashtableSerialization ()
{
var collection = new HashtableContainer ();
var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
}
[Test]
[ExpectedException (typeof (ArgumentException))]
public void TestHashtableDeserialization ()
{
var collection = new HashtableContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
serializer.ReadObject (stream);
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestQueueSerialization ()
{
var collection = new QueueContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
public void TestSortedListSerialization ()
{
var collection = new SortedListContainer ();
var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
}
[Test]
[ExpectedException (typeof (ArgumentException))]
public void TestSortedListDeserialization ()
{
var collection = new SortedListContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
serializer.ReadObject (stream);
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestStackSerialization ()
{
var collection = new StackContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
public void TestEnumerableWithAddSerialization ()
{
var collection = new EnumerableWithAddContainer ();
var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
var expectedItemsCount = 4;
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
collection = (EnumerableWithAddContainer) serializer.ReadObject (stream);
Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestEnumerableWithSpecialAddSerialization ()
{
var collection = new EnumerableWithSpecialAddContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
public void TestHashSetSerialization ()
{
var collection = new GenericHashSetContainer ();
var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
var expectedItemsCount = 2;
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
collection = (GenericHashSetContainer) serializer.ReadObject (stream);
Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
}
[Test]
public void TestLinkedListSerialization ()
{
var collection = new GenericLinkedListContainer ();
var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
var expectedItemsCount = 4;
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
collection = (GenericLinkedListContainer) serializer.ReadObject (stream);
Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestGenericQueueSerialization ()
{
var collection = new GenericQueueContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestGenericStackSerialization ()
{
var collection = new GenericStackContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
public void TestGenericDictionarySerialization ()
{
var collection = new GenericDictionaryContainer ();
var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
}
[Test]
[ExpectedException (typeof (ArgumentException))]
public void TestGenericDictionaryDeserialization ()
{
var collection = new GenericDictionaryContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
serializer.ReadObject (stream);
}
[Test]
public void TestGenericSortedListSerialization ()
{
var collection = new GenericSortedListContainer ();
var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
}
[Test]
[ExpectedException (typeof (ArgumentException))]
public void TestGenericSortedListDeserialization ()
{
var collection = new GenericSortedListContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
serializer.ReadObject (stream);
}
[Test]
public void TestGenericSortedDictionarySerialization ()
{
var collection = new GenericSortedDictionaryContainer ();
var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
}
[Test]
[ExpectedException (typeof (ArgumentException))]
public void TestGenericSortedDictionaryDeserialization ()
{
var collection = new GenericSortedDictionaryContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
serializer.ReadObject (stream);
}
[Test]
public void TestGenericEnumerableWithAddSerialization ()
{
var collection = new GenericEnumerableWithAddContainer ();
var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
var expectedItemsCount = 4;
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
stream.Position = 0;
Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
stream.Position = 0;
collection = (GenericEnumerableWithAddContainer) serializer.ReadObject (stream);
Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestGenericEnumerableWithSpecialAddSerialization ()
{
var collection = new GenericEnumerableWithSpecialAddContainer ();
var serializer = new DataContractJsonSerializer (collection.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, collection);
}
[Test]
[ExpectedException (typeof (InvalidDataContractException))]
public void TestNonCollectionGetOnlyProperty ()
{
var o = new NonCollectionGetOnlyContainer ();
var serializer = new DataContractJsonSerializer (o.GetType ());
var stream = new MemoryStream ();
serializer.WriteObject (stream, o);
}
// properly deserialize object with a polymorphic property (known derived type)
[Test]
public void Bug23058()
{
string serializedObj = @"{""PolymorphicProperty"":{""__type"":""KnownDerivedType:#MonoTests.System.Runtime.Serialization.Json"",""BaseTypeProperty"":""Base"",""DerivedProperty"":""Derived 1""},""Name"":""Parent2""}";
ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
Assert.AreEqual (deserializedObj.PolymorphicProperty.GetType ().FullName, "MonoTests.System.Runtime.Serialization.Json.KnownDerivedType");
Assert.AreEqual (deserializedObj.PolymorphicProperty.BaseTypeProperty, "Base");
Assert.AreEqual ((deserializedObj.PolymorphicProperty as KnownDerivedType).DerivedProperty, "Derived 1");
Assert.AreEqual (deserializedObj.Name, "Parent2");
}
// properly deserialize object with a polymorphic property (base type with __type hint)
[Test]
public void DeserializeBaseTypePropHint()
{
string serializedObj = @"{""PolymorphicProperty"":{""__type"":""BaseType:#MonoTests.System.Runtime.Serialization.Json"",""BaseTypeProperty"":""Base""},""Name"":""Parent2""}";
ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
Assert.AreEqual (deserializedObj.PolymorphicProperty.GetType ().FullName, "MonoTests.System.Runtime.Serialization.Json.BaseType");
Assert.AreEqual (deserializedObj.PolymorphicProperty.BaseTypeProperty, "Base");
}
// properly deserialize object with a polymorphic property (base type with __type hint)
[Test]
public void DeserializeBaseTypePropNoHint()
{
string serializedObj = @"{""PolymorphicProperty"":{""BaseTypeProperty"":""Base""},""Name"":""Parent2""}";
ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
Assert.AreEqual (deserializedObj.PolymorphicProperty.GetType ().FullName, "MonoTests.System.Runtime.Serialization.Json.BaseType");
Assert.AreEqual (deserializedObj.PolymorphicProperty.BaseTypeProperty, "Base");
}
// properly fail deserializing object with a polymorphic property (unknown derived type)
[ExpectedException (typeof (SerializationException))]
[Test]
public void FailDeserializingUnknownTypeProp()
{
string serializedObj = @"{""PolymorphicProperty"":{""__type"":""UnknownDerivedType:#MonoTests.System.Runtime.Serialization.Json"",""BaseTypeProperty"":""Base"",""DerivedProperty"":""Derived 1""},""Name"":""Parent2""}";
ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
}
[Test]
public void SubclassTest ()
{
var knownTypes = new List<Type> { typeof(IntList) };
var serializer = new DataContractJsonSerializer(typeof(ListOfNumbers), knownTypes);
string json = "{\"Numbers\": [85]}";
using (var stream = new MemoryStream(UTF8Encoding.Default.GetBytes(json)))
{
var nums = (ListOfNumbers)serializer.ReadObject(stream);
Assert.AreEqual (1, nums.Numbers.Count);
}
}
[DataContract]
public class ListOfNumbers
{
[DataMember]
public IntList Numbers;
}
public class IntList : List<int>{}
#endregion
[Test]
public void DefaultValueDeserialization ()
{
// value type
var person = new JsonPerson { name = "John" };
using (var ms = new MemoryStream()) {
var serializer = new DataContractJsonSerializer (typeof (JsonPerson), new DataContractJsonSerializerSettings {
SerializeReadOnlyTypes = true,
UseSimpleDictionaryFormat = true
});
serializer.WriteObject (ms, person);
}
// reference type
var person2 = new PersonWithContact {
name = "Jane",
contact = new Contact { url = "localhost", email = "jane@localhost" } };
using (var ms = new MemoryStream ()) {
var serializer = new DataContractJsonSerializer (typeof (PersonWithContact), new DataContractJsonSerializerSettings {
SerializeReadOnlyTypes = true,
UseSimpleDictionaryFormat = true
});
serializer.WriteObject (ms, person2);
}
}
[Test]
public void Bug15028()
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Bug15028));
using (MemoryStream memoryStream = new MemoryStream())
{
ser.WriteObject(memoryStream, new Bug15028());
string output = Encoding.Default.GetString(memoryStream.ToArray());
Assert.AreEqual(@"{""Int0"":1,""Int1"":1,""IntZero1"":0,""Str0"":"""",""Str1"":"""",""StrNull1"":null}", output);
}
}
[Test]
public void Bug4230()
{
string serializedObj = @"{ ""Notifications"": null }";
Bug4230Response deserializedObj = Deserialize<Bug4230Response> (serializedObj);
Assert.IsNull (deserializedObj.Notifications);
}
}
public class Bug4230Notification {
}
public class Bug4230Response
{
public Bug4230Notification[] Notifications
{
get;
set;
}
}
[DataContract]
public class Bug15028
{
[DataMember(EmitDefaultValue = false)]
public string StrNull0 { get; private set; }
[DataMember(EmitDefaultValue = false)]
public string Str0 { get; private set; }
[DataMember(EmitDefaultValue = true)]
public string StrNull1 { get; private set; }
[DataMember(EmitDefaultValue = true)]
public string Str1 { get; private set; }
[DataMember(EmitDefaultValue = false)]
public int IntZero0 { get; private set; }
[DataMember(EmitDefaultValue = false)]
public int Int0 { get; private set; }
[DataMember(EmitDefaultValue = true)]
public int IntZero1 { get; private set; }
[DataMember(EmitDefaultValue = true)]
public int Int1 { get; private set; }
public Bug15028()
{
Str0 = string.Empty;
Str1 = string.Empty;
Int0 = 1;
Int1 = 1;
}
}
public class CharTest
{
public char Foo;
}
public class TestData
{
public string Foo { get; set; }
public string Bar { get; set; }
internal string Baz { get; set; }
}
public enum Colors {
Red, Green, Blue
}
[DataContract (Name = "_ColorsWithDC")]
public enum ColorsWithDC {
[EnumMember (Value = "_Red")]
Red,
[EnumMember]
Green,
Blue
}
public enum ColorsEnumMemberNoDC {
[EnumMember (Value = "_Red")]
Red,
[EnumMember]
Green,
Blue
}
[DataContract]
public class DCWithEnum {
[DataMember (Name = "_colors")]
public Colors colors;
}
[DataContract]
public class DCEmpty
{
// serializer doesn't touch it.
public string Foo = "TEST";
}
[DataContract]
public class DCSimple1
{
[DataMember]
public string Foo = "TEST";
}
[DataContract]
public class DCHasNonDC
{
[DataMember]
public NonDC Hoge= new NonDC ();
}
public class NonDC
{
public string Whee = "whee!";
}
[DataContract]
public class DCHasSerializable
{
[DataMember]
public SimpleSer1 Ser = new SimpleSer1 ();
}
[DataContract (Name = "Foo")]
public class DCWithName
{
[DataMember (Name = "FooMember")]
public string DMWithName = "value";
}
[DataContract (Name = "")]
public class DCWithEmptyName
{
[DataMember]
public string Foo;
}
[DataContract (Name = null)]
public class DCWithNullName
{
[DataMember]
public string Foo;
}
[DataContract (Namespace = "")]
public class DCWithEmptyNamespace
{
[DataMember]
public string Foo;
}
[Serializable]
public class SimpleSer1
{
public string Doh = "doh!";
}
public class Wrapper
{
[DataContract]
public class DCWrapped
{
}
}
[DataContract]
public class CollectionContainer
{
Collection<string> items = new Collection<string> ();
[DataMember]
public Collection<string> Items {
get { return items; }
}
}
[CollectionDataContract]
public class DataCollection<T> : Collection<T>
{
}
[DataContract]
public class DataCollectionContainer
{
DataCollection<string> items = new DataCollection<string> ();
[DataMember]
public DataCollection<string> Items {
get { return items; }
}
}
[DataContract]
class SerializeNonDCArrayType
{
[DataMember]
public NonDCItem [] IPAddresses = new NonDCItem [0];
}
public class NonDCItem
{
public byte [] Data { get; set; }
}
[DataContract]
public class VerifyObjectNameTestData
{
[DataMember]
string Member1 = "foo";
}
[Serializable]
public class KeyValueTestData {
public List<KeyValuePair<string,string>> TestData = new List<KeyValuePair<string,string>>();
}
[DataContract] // bug #586169
public class Query
{
[DataMember (Order=1)]
public DateTime StartDate { get; set; }
[DataMember (Order=2)]
public DateTime EndDate { get; set; }
}
public class ClassA {
public ClassB B { get; set; }
}
public class ClassB
{
}
public class GSPlayerListErg
{
public GSPlayerListErg ()
{
Init ();
}
void Init ()
{
C = true;
ServerTimeUTC = DateTime.SpecifyKind (DateTime.MinValue, DateTimeKind.Utc);
}
[OnDeserializing]
public void OnDeserializing (StreamingContext c)
{
A = true;
Init ();
}
[OnDeserialized]
void OnDeserialized (StreamingContext c)
{
B = true;
}
public static bool A, B, C;
[DataMember (Name = "T")]
public long CodedServerTimeUTC { get; set; }
public DateTime ServerTimeUTC { get; set; }
}
#region polymorphism test helper classes
[DataContract]
[KnownType (typeof (KnownDerivedType))]
public class ParentType
{
[DataMember]
public string Name { get; set; }
[DataMember]
public BaseType PolymorphicProperty { get; set; }
}
[DataContract]
public class BaseType
{
[DataMember]
public string BaseTypeProperty { get; set; }
}
[DataContract]
public class KnownDerivedType : BaseType
{
[DataMemberAttribute]
public string DerivedProperty { get; set; }
}
[DataContract]
public class UnknownDerivedType : BaseType
{
[DataMember]
public string DerivedProperty { get; set; }
}
#endregion
}
[DataContract]
class JsonGlobalSample1
{
}
public class JsonMyDictionary<K, V> : System.Collections.Generic.IDictionary<K, V>
{
Dictionary<K,V> dic = new Dictionary<K,V> ();
public void Add (K key, V value)
{
dic.Add (key, value);
}
public bool ContainsKey (K key)
{
return dic.ContainsKey (key);
}
public ICollection<K> Keys {
get { return dic.Keys; }
}
public bool Remove (K key)
{
return dic.Remove (key);
}
public bool TryGetValue (K key, out V value)
{
return dic.TryGetValue (key, out value);
}
public ICollection<V> Values {
get { return dic.Values; }
}
public V this [K key] {
get { return dic [key]; }
set { dic [key] = value; }
}
IEnumerator IEnumerable.GetEnumerator ()
{
return dic.GetEnumerator ();
}
ICollection<KeyValuePair<K,V>> Coll {
get { return (ICollection<KeyValuePair<K,V>>) dic; }
}
public void Add (KeyValuePair<K, V> item)
{
Coll.Add (item);
}
public void Clear ()
{
dic.Clear ();
}
public bool Contains (KeyValuePair<K, V> item)
{
return Coll.Contains (item);
}
public void CopyTo (KeyValuePair<K, V> [] array, int arrayIndex)
{
Coll.CopyTo (array, arrayIndex);
}
public int Count {
get { return dic.Count; }
}
public bool IsReadOnly {
get { return Coll.IsReadOnly; }
}
public bool Remove (KeyValuePair<K, V> item)
{
return Coll.Remove (item);
}
public IEnumerator<KeyValuePair<K, V>> GetEnumerator ()
{
return Coll.GetEnumerator ();
}
}
public class MyExplicitDictionary<K, V> : IDictionary<K, V> {
Dictionary<K,V> dic = new Dictionary<K,V> ();
public void Add (K key, V value)
{
dic.Add (key, value);
}
public bool ContainsKey (K key)
{
return dic.ContainsKey (key);
}
ICollection<K> IDictionary<K, V>.Keys {
get { return dic.Keys; }
}
public bool Remove (K key)
{
return dic.Remove (key);
}
public bool TryGetValue (K key, out V value)
{
return dic.TryGetValue (key, out value);
}
ICollection<V> IDictionary<K, V>.Values {
get { return dic.Values; }
}
public V this [K key] {
get { return dic [key]; }
set { dic [key] = value; }
}
IEnumerator IEnumerable.GetEnumerator ()
{
return dic.GetEnumerator ();
}
ICollection<KeyValuePair<K,V>> Coll {
get { return (ICollection<KeyValuePair<K,V>>) dic; }
}
public void Add (KeyValuePair<K, V> item)
{
Coll.Add (item);
}
public void Clear ()
{
dic.Clear ();
}
public bool Contains (KeyValuePair<K, V> item)
{
return Coll.Contains (item);
}
public void CopyTo (KeyValuePair<K, V> [] array, int arrayIndex)
{
Coll.CopyTo (array, arrayIndex);
}
public int Count {
get { return dic.Count; }
}
public bool IsReadOnly {
get { return Coll.IsReadOnly; }
}
public bool Remove (KeyValuePair<K, V> item)
{
return Coll.Remove (item);
}
public IEnumerator<KeyValuePair<K, V>> GetEnumerator ()
{
return Coll.GetEnumerator ();
}
}
[DataContract]
public class Bug13485Type
{
[DataMember]
public string Name { get; set; }
[DataMember (Name = "Value")]
private string Value { get; set; }
public string GetValue { get { return this.Value; } }
}
#region Test classes for Collection serialization
[DataContract]
public abstract class CollectionContainer <V>
{
V items;
[DataMember]
public V Items
{
get {
if (items == null) items = Init ();
return items;
}
}
public CollectionContainer ()
{
Init ();
}
protected abstract V Init ();
}
[DataContract]
public class ArrayListContainer : CollectionContainer<ArrayList> {
protected override ArrayList Init ()
{
return new ArrayList { "banana", "apple" };
}
}
[DataContract]
public class BitArrayContainer : CollectionContainer<BitArray> {
protected override BitArray Init ()
{
return new BitArray (new [] { false, true });
}
}
[DataContract]
public class HashtableContainer : CollectionContainer<Hashtable> {
protected override Hashtable Init ()
{
var ht = new Hashtable ();
ht.Add ("key1", "banana");
ht.Add ("key2", "apple");
return ht;
}
}
[DataContract]
public class QueueContainer : CollectionContainer<Queue> {
protected override Queue Init ()
{
var q = new Queue ();
q.Enqueue ("banana");
q.Enqueue ("apple");
return q;
}
}
[DataContract]
public class SortedListContainer : CollectionContainer<SortedList> {
protected override SortedList Init ()
{
var l = new SortedList ();
l.Add ("key1", "banana");
l.Add ("key2", "apple");
return l;
}
}
[DataContract]
public class StackContainer : CollectionContainer<Stack> {
protected override Stack Init ()
{
var s = new Stack ();
s.Push ("banana");
s.Push ("apple");
return s;
}
}
public class EnumerableWithAdd : IEnumerable
{
private ArrayList items;
public EnumerableWithAdd()
{
items = new ArrayList();
}
public IEnumerator GetEnumerator()
{
return items.GetEnumerator();
}
public void Add(object value)
{
items.Add(value);
}
public int Count
{
get {
return items.Count;
}
}
}
public class EnumerableWithSpecialAdd : IEnumerable
{
private ArrayList items;
public EnumerableWithSpecialAdd()
{
items = new ArrayList();
}
public IEnumerator GetEnumerator()
{
return items.GetEnumerator();
}
public void Add(object value, int index)
{
items.Add(value);
}
public int Count
{
get
{
return items.Count;
}
}
}
[DataContract]
public class EnumerableWithAddContainer : CollectionContainer<EnumerableWithAdd>
{
protected override EnumerableWithAdd Init()
{
var s = new EnumerableWithAdd();
s.Add ("banana");
s.Add ("apple");
return s;
}
}
[DataContract]
public class EnumerableWithSpecialAddContainer : CollectionContainer<EnumerableWithSpecialAdd>
{
protected override EnumerableWithSpecialAdd Init()
{
var s = new EnumerableWithSpecialAdd();
s.Add("banana", 0);
s.Add("apple", 0);
return s;
}
}
[DataContract]
public class GenericDictionaryContainer : CollectionContainer<Dictionary<string, string>> {
protected override Dictionary<string, string> Init ()
{
var d = new Dictionary<string, string> ();
d.Add ("key1", "banana");
d.Add ("key2", "apple");
return d;
}
}
[DataContract]
public class GenericHashSetContainer : CollectionContainer<HashSet<string>> {
protected override HashSet<string> Init ()
{
return new HashSet<string> { "banana", "apple" };
}
}
[DataContract]
public class GenericLinkedListContainer : CollectionContainer<LinkedList<string>> {
protected override LinkedList<string> Init ()
{
var l = new LinkedList<string> ();
l.AddFirst ("apple");
l.AddFirst ("banana");
return l;
}
}
[DataContract]
public class GenericListContainer : CollectionContainer<List<string>> {
protected override List<string> Init ()
{
return new List<string> { "banana", "apple" };
}
}
[DataContract]
public class GenericQueueContainer : CollectionContainer<Queue<string>> {
protected override Queue<string> Init ()
{
var q = new Queue<string> ();
q.Enqueue ("banana");
q.Enqueue ("apple" );
return q;
}
}
[DataContract]
public class GenericSortedDictionaryContainer : CollectionContainer<SortedDictionary<string, string>> {
protected override SortedDictionary<string, string> Init ()
{
var d = new SortedDictionary<string, string> ();
d.Add ("key1", "banana");
d.Add ("key2", "apple");
return d;
}
}
[DataContract]
public class GenericSortedListContainer : CollectionContainer<SortedList<string, string>> {
protected override SortedList<string, string> Init ()
{
var d = new SortedList<string, string> ();
d.Add ("key1", "banana");
d.Add ("key2", "apple");
return d;
}
}
[DataContract]
public class GenericStackContainer : CollectionContainer<Stack<string>> {
protected override Stack<string> Init ()
{
var s = new Stack<string> ();
s.Push ("banana");
s.Push ("apple" );
return s;
}
}
public class GenericEnumerableWithAdd : IEnumerable<string>
{
private List<string> items;
public GenericEnumerableWithAdd()
{
items = new List<string>();
}
IEnumerator IEnumerable.GetEnumerator()
{
return items.GetEnumerator ();
}
public IEnumerator<string> GetEnumerator()
{
return items.GetEnumerator ();
}
public void Add(string value)
{
items.Add(value);
}
public int Count
{
get {
return items.Count;
}
}
}
public class GenericEnumerableWithSpecialAdd : IEnumerable<string>
{
private List<string> items;
public GenericEnumerableWithSpecialAdd()
{
items = new List<string>();
}
IEnumerator IEnumerable.GetEnumerator()
{
return items.GetEnumerator ();
}
public IEnumerator<string> GetEnumerator()
{
return items.GetEnumerator ();
}
public void Add(string value, int index)
{
items.Add(value);
}
public int Count
{
get
{
return items.Count;
}
}
}
[DataContract]
public class GenericEnumerableWithAddContainer : CollectionContainer<GenericEnumerableWithAdd>
{
protected override GenericEnumerableWithAdd Init()
{
var s = new GenericEnumerableWithAdd();
s.Add ("banana");
s.Add ("apple");
return s;
}
}
[DataContract]
public class GenericEnumerableWithSpecialAddContainer : CollectionContainer<GenericEnumerableWithSpecialAdd>
{
protected override GenericEnumerableWithSpecialAdd Init()
{
var s = new GenericEnumerableWithSpecialAdd();
s.Add("banana", 0);
s.Add("apple", 0);
return s;
}
}
[DataContract]
public class NonCollectionGetOnlyContainer
{
string _test = "my string";
[DataMember]
public string MyString {
get {
return _test;
}
}
}
#endregion
#region DefaultValueDeserialization
[DataContract]
public class JsonPerson
{
[DataMember(EmitDefaultValue = false)]
public string name { get; set; }
}
[DataContract]
public class PersonWithContact
{
[DataMember(EmitDefaultValue = false)]
public string name { get; set; }
[DataMember(EmitDefaultValue = false)]
public Contact contact { get; set; }
}
[DataContract]
public class Contact
{
[DataMember(EmitDefaultValue = false)]
public string url { get; set; }
[DataMember(EmitDefaultValue = false)]
public string email{ get; set; }
}
#endregion