Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 60 additions & 22 deletions src/MsgPack/Serialization/SerializationTarget.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Serialization;

using MsgPack.Serialization.DefaultSerializers;
Expand Down Expand Up @@ -472,9 +473,9 @@ private static void VerifyNilImplication( Type type, IEnumerable<SerializingMemb
}
}

private static void VerifyKeyUniqueness( IList<SerializingMember> result )
private static void VerifyKeyUniqueness(List<SerializingMember> result )
{
var duplicated = new Dictionary<string, List<MemberInfo>>();
var duplicated = new Dictionary<string, List<SerializingMember>>();
var existents = new Dictionary<string, SerializingMember>();
foreach ( var member in result )
{
Expand All @@ -489,37 +490,74 @@ private static void VerifyKeyUniqueness( IList<SerializingMember> result )
}
catch ( ArgumentException )
{
List<MemberInfo> list;
List<SerializingMember> list;
if ( duplicated.TryGetValue( member.Contract.Name, out list ) )
{
list.Add( member.Member );
list.Add( member );
}
else
{
duplicated.Add( member.Contract.Name, new List<MemberInfo> { existents[ member.Contract.Name ].Member, member.Member } );
duplicated.Add(member.Contract.Name, new List<SerializingMember> { existents[member.Contract.Name], member });
}
}
}

if ( duplicated.Count > 0 )
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
"Some member keys specified with custom attributes are duplicated. Details: {{{0}}}",
String.Join(
",",
duplicated.Select(
kv => String.Format(
CultureInfo.CurrentCulture,
"\"{0}\":[{1}]",
kv.Key,
String.Join( ",", kv.Value.Select( m => String.Format( CultureInfo.InvariantCulture, "{0}.{1}({2})", m.DeclaringType, m.Name, ( m is FieldInfo ) ? "Field" : "Property" ) ).ToArray() )
)
).ToArray()
)
)
);
//strip out any properties that have the new keyword or are overriding a virtual
var removeKeys = new List<string>();
foreach (KeyValuePair<string, List<SerializingMember>> kvp in duplicated)
{
int removed = 0;
foreach (var memberInfo in kvp.Value)
{
if (memberInfo.Member.DeclaringType != typeof (object))
{
foreach (var derived in kvp.Value)
{
if (memberInfo.Member == derived.Member)
{
continue;
}

if (memberInfo.Member.DeclaringType.IsSubclassOf(derived.Member.DeclaringType))
{
result.Remove(derived);
removed++;
}
}
}
}
if (kvp.Value.Count - removed == 1)
{
removeKeys.Add(kvp.Key);
}
}
foreach (var key in removeKeys)
{
duplicated.Remove(key);
}

if (duplicated.Count > 0)
{
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
"Some member keys specified with custom attributes are duplicated. Details: {{{0}}}",
String.Join(
",",
duplicated.Select(
kv => String.Format(
CultureInfo.CurrentCulture,
"\"{0}\":[{1}]",
kv.Key,
String.Join(",", kv.Value.Select(m => String.Format(CultureInfo.InvariantCulture, "{0}.{1}({2})", m.Member.DeclaringType, m.Member.Name, (m is FieldInfo) ? "Field" : "Property")).ToArray())
)
).ToArray()
)
)
);
}
}
}

Expand Down