BinarySerializer.Serialize异常:索引超出了数组的界限



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

  • BinarySerializer.Serialize异常:索引超出界限数组的
  • BinarySerializer.Serialize异常:内部数组不能扩展到大于Int32.MaxValue元素
  • BinarySerializer.Serialize异常:类型'USC.GISResearchLab.Geocoding.Core.ReferenceDatasets.Sources.Implementations.OpenAddressPoints在程序集中'Tamu.GeoInnovation.Geocoding.Core.ReferenceDatasets.FeatureSources,未标记Version=1.0.0.0,Culture=neutral,PublicKeyToken=null作为可串行化

这是正在调用的方法:

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

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

BinarySerializer.Serialize异常:程序集"Tamu.GeoInnovation.Geocoding.Core.ReferenceDatasets.Sources.Implementations.Op enAddressPoints"中的类型"USC.GISResearchLab.Geocodiing.Core.ReferenceDatasets.FeatureSources,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"未标记为可序列化

考虑此代码

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

公共课程{公共静态void Main(){var c=new MyClass();c.Child=新的MyClass.SubClass();byte[]字节;使用(MemoryStream流=新MemoryStream()){new BinaryFormatter().Serialize(流,c);字节=流。ToArray();}
Console.WriteLine("成功")
}}

现在它不会成功。但如果您在子类中取消对[Serializable]的注释,它会的。在您的代码中,您在此处检查父类的"可序列化">

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 ,你似乎在旧的框架上运行

最新更新