BinarySerializer.Serialize 异常:索引超出数组范围

BinarySerializer.Serialize Exception: Index was outside the bounds of the array

我实际上遇到了各种 BinarySerializer 异常,例如:

调用的方法如下:

try
        {

            string databaseName = ((IUserManagableBatchServiceManagableWebApplicationState)WebApplicationState).DatabaseManager.GetDatabaseNameFromGuid(databaseGuid);
            int databaseId = ((IUserManagableBatchServiceManagableWebApplicationState)WebApplicationState).DatabaseManager.GetDatabaseIdFromGuid(databaseGuid);
            string tableName = ((IUserManagableBatchServiceManagableWebApplicationState)WebApplicationState).DatabaseManager.GetTableNameFromGuid(tableGuid);
            int tableId = ((IUserManagableBatchServiceManagableWebApplicationState)WebApplicationState).DatabaseManager.GetTableIdFromGuid(tableGuid);
            int userId = ((IUserManagableWebApplicationState)WebApplicationState).UserManager.GetUserIdFromGuid(userGuid);

            string sql = "";
            sql += " INSERT INTO Processes ";
            sql += " (";
            ...<many column and value fields here that should not be relevant to error>
            sql += " )";
            SqlCommand cmd = new SqlCommand(sql);

            cmd.Parameters.Add(SqlParameterUtils.BuildSqlParameter("args", SqlDbType.VarBinary, BinarySerializer.Serialize(args)));
            cmd.Parameters.Add(SqlParameterUtils.BuildSqlParameter("geocoderConfiguration", SqlDbType.VarBinary, BinarySerializer.Serialize(configuration)));  

            IQueryManager qm = WebApplicationState.QueryManager;
            qm.AddParameters(cmd.Parameters);
            qm.ExecuteNonQuery(CommandType.Text, cmd.CommandText, true);
            }
            catch (Exception ex)
            {
                string msg = "Error InsertProcess Method2: " + ex.Message;
                throw new Exception(msg, ex);
            }
        }

我无法在本地重现该问题,经过相当长的调试后也无法找到所描述的任何问题。奇怪的是,在 IIS 中回收应用程序池解决了这个问题,并且该过程能够无错误地启动。然后它稍后再次弹出并且现在似乎更频繁地出现。除非我遗漏了一些东西,否则我无法在日志文件中找到任何相关内容。我确信这对大多数人来说是一个明显的问题,但应用程序池绝对不是我的强项。如果有人能指出我正确的解决方案或更好的调试方向,将不胜感激。

这是 BinarySerializer class:

 public class BinarySerializer
    {

        public static byte[] Serialize(object o)
        {

            byte[] ret = null;
            try
            {
                if (o != null)
                {
                    if (o.GetType().IsSerializable)
                    {
                        MemoryStream ms = new MemoryStream();
                        BinaryFormatter bf = new BinaryFormatter();

                        bf.Serialize(ms, o);
                        ret = ms.ToArray();
                    }
                    else
                    {
                        throw new Exception("BinarySerializer Exception: object is not serializable");
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception("BinarySerializer.Serialize Exception: " + e.Message, e);
            }
            return ret;
        }

既然我看到了你的代码,我想我知道你的案例 #3 会发生什么

BinarySerializer.Serialize Exception: Type 'USC.GISResearchLab.Geocoding.Core.ReferenceDatasets.Sources.Implementations.Op enAddressPoints' in Assembly 'Tamu.GeoInnovation.Geocoding.Core.ReferenceDatasets.FeatureSources, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable

考虑这段代码

[Serializable]
public class MyClass 
{
    public SubClass Child {get; set;}

    //[Serializable] //-- not serializable
    public class SubClass 
    {
        public int Id {get; set;}
        public string Name {get;set;}
    }
}

public class 程序 { public static void Main() { var c = new MyClass(); c.Child = 新 MyClass.SubClass(); 字节[] 字节; 使用 (MemoryStream stream = new MemoryStream()) { new BinaryFormatter().Serialize(stream, c); 字节数 = stream.ToArray(); }
Console.WriteLine("Success");
} }

目前不会成功。但是如果你 un-comment [Serializable] 在 child class 它会。在您的代码中,您在 parent class 此处检查 'serializable'

if (o.GetType().IsSerializable)

但是 children 呢?您似乎希望某些 objects 出现 not-serializable。在这种情况下,您需要递归检查 class 属性 层次结构中是否存在任何 class 属性,这些属性也是可序列化的。

建议:

重构您的 Serialize 方法

public static byte[] Serialize(object o)
{

    if (o != null) return null;
    if (o.GetType().IsSerializable)
        throw new Exception("BinarySerializer Exception: object is not serializable");

    byte[] ret = null;

    try
    {
        using(MemoryStream ms = new MemoryStream()
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, o);
            ret = ms.ToArray();
            ms.Close(); 
        }
    catch (Exception e)
    {
        throw new Exception("BinarySerializer.Serialize Exception: " + e.Message, e);
    }

    return ret;
}

您的案例 #2

BinarySerializer.Serialize Exception: The internal array cannot expand to greater than Int32.MaxValue elements

只能说明你的连载量太大了。

您的案例 #1

BinarySerializer.Serialize Exception: Index was outside the bounds of the array

也与objects太大有关。

有一件事……其中一些问题是框架中的错误。如果这是 IIS6

,那么您似乎 运行 在较旧的框架上