BinarySerializer.Serialize 异常:索引超出数组范围
BinarySerializer.Serialize Exception: Index was outside the bounds of the array
我实际上遇到了各种 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' 没有标注
可序列化。
调用的方法如下:
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
,那么您似乎 运行 在较旧的框架上
我实际上遇到了各种 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' 没有标注 可序列化。
调用的方法如下:
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
,那么您似乎 运行 在较旧的框架上