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

时间:2017-10-24 14:20:57

标签: c# .net iis-6

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

  • BinarySerializer.Serialize异常:索引超出范围 数组。
  • BinarySerializer.Serialize异常:内部数组不能 扩展到大于Int32.MaxValue元素。
  • BinarySerializer.Serialize异常:类型 ' USC.GISResearchLab.Geocoding.Core.ReferenceDatasets.Sources.Implementations.Op enAddressPoints' 在大会 ' Tamu.GeoInnovation.Geocoding.Core.ReferenceDatasets.FeatureSources, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'没有标记 as serializable。

这是被调用的方法:

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类:

 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;
        }

1 个答案:

答案 0 :(得分:0)

现在我想到了你的代码,我知道你的情况会发生什么#3

  

BinarySerializer.Serialize异常:输入&#39; USC.GISResearchLab.Geocoding.Core.ReferenceDatasets.Sources.Implementations.Op enAddressPoints&#39;在Assembly&#39; Tamu.GeoInnovation.Geocoding.Core.ReferenceDatasets.FeatureSources,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#39;未标记为可序列化

考虑这段代码

[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 static void Main()     {         var c = new MyClass();         c.Child = new MyClass.SubClass();         byte []字节;         使用(MemoryStream stream = new MemoryStream())         {             new BinaryFormatter()。Serialize(stream,c);             bytes = stream.ToArray();         }
        Console.WriteLine(#34&;成功&#34);
     } }

现在它不会成功。但是如果你在子类中取消注释[Serializable]它会。在您的代码中,您检查父类是否可以序列化&#39;这里

if (o.GetType().IsSerializable)

但孩子呢?您似乎期望某些对象不可序列化。在这种情况下,您需要递归检查类属性的层次结构属性层次结构,也可以序列化。

<强>建议:

重构您的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异常:内部数组无法扩展到大于Int32.MaxValue元素

只是表明您的序列化太大了。

你的案例#1

  

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

也与太大的物体有关。

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

,您似乎在旧框架上运行