-Refactoring

This commit is contained in:
James Newton-King
2014-06-21 16:38:52 +12:00
parent ca2d865321
commit c545dc3f43
9 changed files with 94 additions and 50 deletions
@@ -23,7 +23,10 @@
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System.IO;
using System.Text;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Linq;
#if !(NETFX_CORE || PORTABLE || PORTABLE40)
using System;
using System.Collections.Generic;
@@ -272,6 +275,47 @@ namespace Newtonsoft.Json.Tests.Converters
Assert.AreEqual(t1.TableName, t2.TableName);
}
[Test]
public void RoundtripBsonBytes()
{
Guid g = new Guid("EDE9A599-A7D9-44A9-9243-7C287049DD20");
var table = new DataTable();
table.Columns.Add("data", typeof(byte[]));
table.Columns.Add("id", typeof(Guid));
table.Rows.Add(Encoding.UTF8.GetBytes("Hello world!"), g);
JsonSerializer serializer = new JsonSerializer();
MemoryStream ms = new MemoryStream();
BsonWriter bw = new BsonWriter(ms);
serializer.Serialize(bw, table);
JToken o = JToken.ReadFrom(new BsonReader(new MemoryStream(ms.ToArray())) { ReadRootValueAsArray = true });
Assert.AreEqual(@"[
{
""data"": ""SGVsbG8gd29ybGQh"",
""id"": ""ede9a599-a7d9-44a9-9243-7c287049dd20""
}
]", o.ToString());
DataTable deserializedDataTable = serializer.Deserialize<DataTable>(new BsonReader(new MemoryStream(ms.ToArray())) { ReadRootValueAsArray = true });
Assert.AreEqual(string.Empty, deserializedDataTable.TableName);
Assert.AreEqual(2, deserializedDataTable.Columns.Count);
Assert.AreEqual("data", deserializedDataTable.Columns[0].ColumnName);
Assert.AreEqual(typeof(byte[]), deserializedDataTable.Columns[0].DataType);
Assert.AreEqual("id", deserializedDataTable.Columns[1].ColumnName);
Assert.AreEqual(typeof(Guid), deserializedDataTable.Columns[1].DataType);
Assert.AreEqual(1, deserializedDataTable.Rows.Count);
DataRow dr1 = deserializedDataTable.Rows[0];
CollectionAssert.AreEquivalent(Encoding.UTF8.GetBytes("Hello world!"), (byte[])dr1["data"]);
Assert.AreEqual(g, (Guid)dr1["id"]);
}
[Test]
public void SerializeDataTableWithNull()
{
@@ -143,7 +143,7 @@ namespace Newtonsoft.Json.Converters
dr[columnName] = nestedDt;
}
else if (column.DataType.IsArray)
else if (column.DataType.IsArray && column.DataType != typeof(byte[]))
{
if (reader.TokenType == JsonToken.StartArray)
reader.Read();
@@ -184,6 +184,7 @@ namespace Newtonsoft.Json.Converters
case JsonToken.Float:
case JsonToken.String:
case JsonToken.Date:
case JsonToken.Bytes:
return reader.ValueType;
case JsonToken.Null:
case JsonToken.Undefined:
@@ -295,7 +295,7 @@ namespace Newtonsoft.Json.Schema
{
CurrentSchema.Enum = new List<JToken>();
EnumValues<long> enumValues = EnumUtils.GetNamesAndValues<long>(type);
IList<EnumValue<long>> enumValues = EnumUtils.GetNamesAndValues<long>(type);
foreach (EnumValue<long> enumValue in enumValues)
{
JToken value = JToken.FromObject(enumValue.Value);
@@ -916,9 +916,9 @@ namespace Newtonsoft.Json.Serialization
ConstructorInfo constructorInfo = contract.NonNullableUnderlyingType.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null);
if (constructorInfo != null)
{
MethodCall<object, object> methodCall = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall<object>(constructorInfo);
ObjectConstructor<object> creator = JsonTypeReflector.ReflectionDelegateFactory.CreateParametrizedConstructor(constructorInfo);
contract.ISerializableCreator = (args => methodCall(null, args));
contract.ISerializableCreator = creator;
}
return contract;
@@ -60,7 +60,7 @@ namespace Newtonsoft.Json.Serialization
private readonly Type _genericCollectionDefinitionType;
private Type _genericWrapperType;
private MethodCall<object, object> _genericWrapperCreator;
private ObjectConstructor<object> _genericWrapperCreator;
private Func<object> _genericTemporaryCollectionCreator;
internal bool IsArray { get; private set; }
@@ -222,10 +222,10 @@ namespace Newtonsoft.Json.Serialization
constructorArgument = _genericCollectionDefinitionType;
ConstructorInfo genericWrapperConstructor = _genericWrapperType.GetConstructor(new[] { constructorArgument });
_genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall<object>(genericWrapperConstructor);
_genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParametrizedConstructor(genericWrapperConstructor);
}
return (IWrappedCollection)_genericWrapperCreator(null, list);
return (IWrappedCollection)_genericWrapperCreator(list);
}
internal IList CreateTemporaryCollection()
@@ -64,7 +64,7 @@ namespace Newtonsoft.Json.Serialization
private readonly Type _genericCollectionDefinitionType;
private Type _genericWrapperType;
private MethodCall<object, object> _genericWrapperCreator;
private ObjectConstructor<object> _genericWrapperCreator;
private Func<object> _genericTemporaryDictionaryCreator;
@@ -166,10 +166,10 @@ namespace Newtonsoft.Json.Serialization
_genericWrapperType = typeof(DictionaryWrapper<,>).MakeGenericType(DictionaryKeyType, DictionaryValueType);
ConstructorInfo genericWrapperConstructor = _genericWrapperType.GetConstructor(new[] { _genericCollectionDefinitionType });
_genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateMethodCall<object>(genericWrapperConstructor);
_genericWrapperCreator = JsonTypeReflector.ReflectionDelegateFactory.CreateParametrizedConstructor(genericWrapperConstructor);
}
return (IWrappedDictionary)_genericWrapperCreator(null, dictionary);
return (IWrappedDictionary)_genericWrapperCreator(dictionary);
}
internal IDictionary CreateTemporaryDictionary()
+4 -4
View File
@@ -47,7 +47,7 @@ namespace Newtonsoft.Json.Utilities
Type underlyingType = Enum.GetUnderlyingType(value.GetType());
ulong num = Convert.ToUInt64(value, CultureInfo.InvariantCulture);
EnumValues<ulong> enumNameValues = GetNamesAndValues<T>();
IList<EnumValue<ulong>> enumNameValues = GetNamesAndValues<T>();
IList<T> selectedFlagsValues = new List<T>();
foreach (EnumValue<ulong> enumNameValue in enumNameValues)
@@ -66,7 +66,7 @@ namespace Newtonsoft.Json.Utilities
/// Gets a dictionary of the names and values of an Enum type.
/// </summary>
/// <returns></returns>
public static EnumValues<ulong> GetNamesAndValues<T>() where T : struct
public static IList<EnumValue<ulong>> GetNamesAndValues<T>() where T : struct
{
return GetNamesAndValues<ulong>(typeof(T));
}
@@ -76,7 +76,7 @@ namespace Newtonsoft.Json.Utilities
/// </summary>
/// <param name="enumType">The enum type to get names and values for.</param>
/// <returns></returns>
public static EnumValues<TUnderlyingType> GetNamesAndValues<TUnderlyingType>(Type enumType) where TUnderlyingType : struct
public static IList<EnumValue<TUnderlyingType>> GetNamesAndValues<TUnderlyingType>(Type enumType) where TUnderlyingType : struct
{
if (enumType == null)
throw new ArgumentNullException("enumType");
@@ -86,7 +86,7 @@ namespace Newtonsoft.Json.Utilities
IList<object> enumValues = GetValues(enumType);
IList<string> enumNames = GetNames(enumType);
EnumValues<TUnderlyingType> nameValues = new EnumValues<TUnderlyingType>();
IList<EnumValue<TUnderlyingType>> nameValues = new List<EnumValue<TUnderlyingType>>();
for (int i = 0; i < enumValues.Count; i++)
{
+35 -35
View File
@@ -1,37 +1,37 @@
#region License
// Copyright (c) 2007 James Newton-King
//
// 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.
#endregion
//#region License
//// Copyright (c) 2007 James Newton-King
////
//// 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.
//#endregion
using System.Collections.ObjectModel;
//using System.Collections.ObjectModel;
namespace Newtonsoft.Json.Utilities
{
internal class EnumValues<T> : KeyedCollection<string, EnumValue<T>> where T : struct
{
protected override string GetKeyForItem(EnumValue<T> item)
{
return item.Name;
}
}
}
//namespace Newtonsoft.Json.Utilities
//{
// internal class EnumValues<T> : KeyedCollection<string, EnumValue<T>> where T : struct
// {
// protected override string GetKeyForItem(EnumValue<T> item)
// {
// return item.Name;
// }
// }
//}
@@ -71,5 +71,4 @@ namespace Newtonsoft.Json.Utilities
}
}
}
#endif