我需要将一些以序列化形式编写的文件作为 windows 机器(C#.NET 序列化)中的文件传输到 linux 机器。我怎样才能做到这一点?我需要在 linux 端优先使用 perl/Java/bash。
编辑:为了更清楚,文件是文本文件..但在 .NET 中序列化的二进制文件。在 linux 端,我需要使用 Perl/Java/Bash 来反序列化和读取这些文件。我有不能触及 .NET 端代码的约束。我所做的任何事情都必须在 linux 端。
谢谢,
最佳答案
如果您有 .NET CLI 实现,则可以在 Linux 上反序列化 .NET 序列化数据,例如 Mono或 DotGNU .这样您就可以编写一个 C# 包装器来处理反序列化,然后如 Brian 上面所述,如果您想在非 .NET 应用程序中使用数据,则可以使用 XML 重新序列化。
对于 .NET,必要的命名空间和类是:
BinaryFormatter 和 FileStream 类:
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
System.IO.FileStream
要反序列化,请创建 BinaryFormatter 和 FileStream 类的实例,将序列化数据加载到 FileStream 中。然后在 BinaryFormatter 上调用反序列化并转换为必要的数据类型(我在下面将其称为 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 序列化的更多信息,请参阅 this page在 MSDN 上。
为了在 Linux 上使用 .NET,Mono 项目创建了一个名为 MonoDevelop 的 IDE,其工作方式与 Windows 上的 Visual Studio 类似。
希望这些信息对您有用!
关于c# - 我们可以在 Linux 机器上读取在 .NET 中序列化的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4471586/