internal static SerializationInfo PrepareConstructorArgs(object serObj, string[] fieldNames, object[] fieldValues, out StreamingContext context)
{
SerializationInfo serializationInfo = null;
if (serObj is ISerializable)
{
serializationInfo = new SerializationInfo(serObj.GetType(), ObjectCloneHelper.s_converter);
for (int i = 0; i < fieldNames.Length; i++)
{
if (fieldNames[i] != null)
{
serializationInfo.AddValue(fieldNames[i], fieldValues[i]);
}
}
}
else
{
Hashtable hashtable = new Hashtable();
int j = 0;
int num = 0;
while (j < fieldNames.Length)
{
if (fieldNames[j] != null)
{
hashtable[fieldNames[j]] = fieldValues[j];
num++;
}
j++;
}
MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(serObj.GetType());
for (int k = 0; k < serializableMembers.Length; k++)
{
string name = serializableMembers[k].Name;
if (!hashtable.Contains(name))
{
object[] customAttributes = serializableMembers[k].GetCustomAttributes(typeof(OptionalFieldAttribute), false);
if (customAttributes == null || customAttributes.Length == 0)
{
throw new SerializationException(Environment.GetResourceString("Serialization_MissingMember", new object[]
{
serializableMembers[k],
serObj.GetType(),
typeof(OptionalFieldAttribute).FullName
}));
}
}
else
{
object value = hashtable[name];
FormatterServices.SerializationSetValue(serializableMembers[k], serObj, value);
}
}
}
context = ObjectCloneHelper.s_cloneContext;
return(serializationInfo);
}