我实际上得到了各种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类:
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;
}
答案 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
,您似乎在旧框架上运行