我需要将一些以序列化形式编写的文件作为Windows机器(C#.NET序列化)中的文件传输到linux机器。我怎样才能做到这一点?我需要在linux端使用perl / Java / bash。
编辑:为了更清楚,文件是文本文件..但在.NET中进行二进制序列化。在linux方面,我需要使用Perl / Java / Bash来反序列化和读取这些文件。我有一个约束,即.NET端代码无法触及..我所做的一切都必须在linux端..
谢谢,
答案 0 :(得分:6)
如果您具有.NET CLI实现,则可以在Linux上反序列化.NET序列化数据,例如Mono或DotGNU。通过这种方式,您可以编写一个C#包装器来处理反序列化,如上所述,如果您想在非.NET应用程序中使用数据,请使用XML进行重新编译。
对于.NET,必要的名称空间和类是:
BinaryFormatter和FileStream类:
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
System.IO.FileStream
要反序列化,请创建BinaryFormatter和FileStream类的实例,将序列化数据加载到FileStream中。然后在BinaryFormatter上调用Deserialize并转换为必要的数据类型(我在下面称它为TheClass):
BinaryFormatter formatter = new BinaryFormatter();
FileStream file = File.OpenRead(@"InsertFileName");
TheClass classInstance = (TheClass)formatter.Deserialize(file);
file.Close();
使用原始XML或SOAP的XML序列化与非.NET应用程序更具互操作性。使用SoapFormatter类可以获得SOAP序列化:
System.Runtime.Serialization.Formatters.Soap.SoapFormatter
通过创建FileStream和SoapFormatter实例并调用Soapformatter Serialize方法来执行序列化。要序列化上面的classInstance示例:
FileStream file = File.Create(@"InsertFileName");
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(file, classInstance);
file.Close();
原始XML序列化是高度可定制的,但工作方式略有不同。 XMLSerializer类用于此目的:
System.Xml.Serialization.XmlSerializer
要使用XML序列化序列化TheClass,您需要XmlSerializer和StreamWriter的实例(在System.IO中):
XmlSerializer serializer = new XmlSerializer(typeof(TheClass));
StreamWriter xmlFile = new StreamWriter(@"InsertFileName");
serializer.Serialize(xmlFile, classInstance);
xmlFile.Close();
一旦使用XML,无论是原始的还是SOAP,其他语言(如Java)都应该很难阅读它们。有关XML序列化的更多信息,请参阅MSDN上的this page。
为了在Linux上使用.NET,Mono Project创建了一个名为MonoDevelop的IDE,其工作方式与Windows上的Visual Studio类似。
我希望这个信息很有用!
答案 1 :(得分:2)
即使您无法触摸.Net代码,您仍然可以通过编写一个简单的.Net程序来解决这个问题,该程序将序列化对象作为输入,并将一个重新序列化的对象作为输出(使用更容易的序列化)阅读,如XML)。如果这不切实际,你将会感受到痛苦。我不知道可以读取Windows .Net二进制序列化文件的Linux包装器,尽管Mono可能知道如何操作。
如果你想自己做,你可能会发现Lluis Sanchez Gual的page在记录它是如何工作方面是一个有用的开始,虽然这是一个旧页面。
答案 2 :(得分:1)
序列化包含足够的信息来提取相应的对象并用日期填充它们。
对于简单对象,您可以模拟反序列化过程,但没有什么可以帮助您这样做。你需要自己实现一切。