繁体   English   中英

我们可以在linux机器上读取.NET中序列化的对象吗?

[英]Can we read an object serialized in .NET in a linux machine?

我需要将一些以序列化形式编写的文件作为Windows机器(C#.NET序列化)中的文件传输到linux机器。 我怎样才能做到这一点? 我需要在linux端使用perl / Java / bash。

编辑:为了更清楚,文件是文本文件..但在.NET中二进制序列化。 在linux方面,我需要使用Perl / Java / Bash来反序列化和读取这些文件。 我有一个约束,即.NET端代码无法触及..我所做的一切都必须在linux端。

谢谢,

如果您具有.NET CLI实现(例如MonoDotGNU) ,则可以在Linux上反序列化.NET序列化数据。 通过这种方式,您可以编写一个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上的此页面

为了在Linux上使用.NET,Mono Project创建了一个名为MonoDevelop的IDE,其工作方式与Windows上的Visual Studio类似。

我希望这个信息是有用的!

即使您无法触摸.Net代码,您仍然可以通过编写一个简单的.Net程序来解决这个问题。该程序将序列化对象作为输入,并将一个重新序列化的对象作为输出(使用更易于阅读的序列化,比如XML)。 如果这不切实际,你将会感受到痛苦。 我不知道可以读取Windows .Net二进制序列化文件的Linux包装器,尽管Mono可能知道如何操作它。

如果你想自己做,你可能会发现Lluis Sanchez Gual的页面是一个有用的开始,记录它是如何工作的,尽管它是一个旧页面。

序列化包含足够的信息来提取相应的对象并用日期填充它们。

对于简单对象,您可以模拟反序列化过程,但没有任何东西可以帮助您这样做。 你需要自己实现一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM