从文件中Deserialize出一个对象
解决方案 »
- 2个音频对比,判读是否一样,各位提供点思路,谢谢。.net
- 帖子中win32 sdk的代码如何在C#中实现
- 生命游戏LifeGame
- 求大虾指点个C#字符串截取问题,谢谢
- name=12345,点击确定按钮,如何生成一个保存name信息的xml文件啊?
- 多个表实现Treeview的问题 有经验的进来看看 在线等
- 请教,C#如何在office2000的access数据库表中,存图片(.jpg/.gif格式),不是存地址,而是存入二进制值的方法(代码)
- 试图运行项目时出错:
- 用VS2013遇到一些问题~求助~~
- 小问题,如何解决 funtion 返回多个参数值的问题
- 请问哪位朋友有将sql server2000所有的数据库,表,约束,存储过程,视图等做为结点导入到WINFORM中TreeView中的代码,思路??谢谢!!
- 如何得到系统当前时间前20秒的时间值?
在.net建的winform工程中使用它就没问题。 /// <summary>
/// Static function to output XML string of the given Pipeline object
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string SerializeXML(Pipeline obj)
{
try
{
// Create a memory stream
MemoryStream ms = new MemoryStream();
SerializeXML(ms, obj); return System.Text.UnicodeEncoding.UTF8.GetString(ms.ToArray());
}
catch (Exception e)
{
throw e;
} }
/// <summary>
/// Static function to output XML to stream of the given Pipeline object
/// </summary>
/// <param name="s">stream of any kind</param>
/// <param name="obj">object to be serialized</param>
/// <returns></returns>
public static void SerializeXML(Stream s, Pipeline obj)
{
try
{
// Create a formatter object
SoapFormatter sf = new SoapFormatter();
//allow deserialize of the older version
sf.AssemblyFormat = FormatterAssemblyStyle.Simple;
IFormatter formatter = (IFormatter) sf;
//(IFormatter)new BinaryFormatter() // Serialize the object graph to stream
formatter.Serialize(s, obj);
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// Static function to create a Pipeline from a XML string
/// </summary>
/// <param name="xml">xml</param>
/// <returns>Pipeline object or null</returns>
public static Pipeline GetFromXML(String xml)
{
byte[] ba = System.Text.UnicodeEncoding.UTF8.GetBytes(xml);
MemoryStream ms = new MemoryStream(ba); // Deserialize the object graph from stream
Pipeline obj = null;
try
{
obj = GetFromXML( ms);
}
// Handler for BinaryFormatter exception
catch (SerializationException e)
{
throw e;
}
// Handler for SoapException
catch (ArgumentException e)
{
throw e;
} ms.Close(); return obj;
} /// <summary>
/// Static function to create a Pipeline from a XML stream
/// </summary>
/// <param name="s">Stream of any kind</param>
/// <returns>object</returns>
public static Pipeline GetFromXML(Stream s)
{
// Create a formatter object based on command line arguments
SoapFormatter sf = new SoapFormatter();
//allow deserialize of the older version
sf.AssemblyFormat = FormatterAssemblyStyle.Simple;
IFormatter formatter = (IFormatter) sf;
//(IFormatter)new BinaryFormatter()
#if DEBUG
Console.WriteLine("(s): " + s.ToString());
#endif // Deserialize the object graph from stream
Pipeline obj = null;
try
{
obj = formatter.Deserialize(s) as Pipeline;
#if DEBUG
Console.WriteLine("Pipeline.GetFromXML(s): obj " + (obj == null? " is null" : " is not null"));
#endif
}
// Handler for BinaryFormatter exception
catch (SerializationException e)
{
throw e;
}
// Handler for SoapException
catch (ArgumentException e)
{
throw e;
}
return obj;
}
solution里的winform工程里可以正确调用序列化,反序列化方法!
但是还要给asp用,所以在用vbs调,居然报错!
是问你vbs如何穿参数给组件的,我怀疑传参数的问题,或者参数定义的问题
你可以这样是试试,
如果vbs是ie的脚本,在vs.net环境下-〉调试-〉附加进程-〉ie,启动你的脚本,在你的dll里加断点,看看与winform有什么不同。
如果是运行在别的环境下的脚本,原理与此相同
会不会跟编码有关系?
你试着把XML输出来,看看是什么样子的?
有关如何序列化和反序列化对象的详细内容请参考下面的专栏(Run-time Serialization part1-part3):
http://msdn.microsoft.com/msdnmag/issues/02/04/net/
http://msdn.microsoft.com/msdnmag/issues/02/07/net/
http://msdn.microsoft.com/msdnmag/issues/02/09/net/
我要查一下
我把所有dll都放到vbs同一目录中了,vbs中先serialize,再deserialize。
serialize成功了,生成了文件,打开文件看内容也没问题。
就是deserialize还是报那错!
msgbox "调试开始"
..
启动cscript you.vbs
他会中断,然后再vs.net-〉调试-〉附加进程->cscript.exe
vbs 下一步到catch里去了。(obj value: undifined value ,Type pipeline)
winform则执行下一句(obj value: {pipeline},Type: pipeline)
Console.WriteLine("Pipeline.GetFromXML(s): obj " + (obj == null? " is null" : " is not null"));
另外附加进程是会问你选择调试类型要选Common Language runtime
在a.dll的方法b处加的断点,单步调试进去,他们走的是一样的。
只是用vbs调出问题。不知道是不是和vbs调用dll的机制有关。
因为.net工程中是互相项目引用,运行时肯定调用了正确的dll。
而vbs不是.net的,引用com机制,不知道在引用时是否会dll版本不对.但是我对要调用到的两个dll的build属性里都设了注册位com.是要把dll都放到GAC中,如何做呢?
winform调试时我特地选择vbs中serialize生成的那个文件来读取,结果winform没问题。
需要把所有最新dll放到同一目录中,在cmd line 在目录执行gacutil /u xxx (一个个来) 注销Global Aseembly Cache 中老版本dll
然后执行gacutil /i xxx.dll 把新版本dll copy到 Global Aseembly Cache 中。然后运行vbs就成功了!之前调试时就发现从c:\winnt\assembly\gac\里 load 相关dll的,估计是那里的dll版本不对,就是不知道怎么处理GAC。
If your application serializes objects whose types are defined in an assembly your application loads using Assembly.LoadFrom, then I recommend you implement a method whose signature matches the System.ResolveEventHandler delegate and register this method with System.AppDomain's AssemblyResolve event just before calling a formatter's Deserialize method.
下载的实例代码\NET0204\LoadFromSerialization\App.cs里面描述了如何使用避免这个错误。如果问题还没有解决,你可以试一试。