首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#手动反序列化

C#手动反序列化
EN

Stack Overflow用户
提问于 2019-02-18 14:03:55
回答 1查看 450关注 0票数 0

我想知道是否可以手动解析已在c#中序列化的二进制文件。

我的最终目标是解析已经在c#中序列化的多维数组的序列化二进制文件,并在java中解析它,

我想知道是否有任何算法/备忘单帮助我理解序列化二进制文件的结构?

任何指针/提示都非常感谢。

注意:我不想在Java中反序列化序列化对象,我想知道二进制序列化对象的结构,这样我就可以以我想要的方式解析它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-20 10:14:13

正如建议的那样,XML可以成为这方面的一个很好的工具,下面是一个小型演示示例:

C#序列化:

代码语言:javascript
复制
// NEEDED IMPORTS
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

static void Main(string[] args)
{
  // build a list of lists from 0 to 99 divided on 
  // 10 inner list each with 10 elements
  List<List<string>> list = new List<List<string>>();
  for(int i=0; i<10; i++)
  {
    list.Add(new List<string>());
    for (int j = i * 10; j < i * 10 + 10; j++)
      list[i].Add(j.ToString());
  }

  // serialize to xml 
  XmlSerializer ser = new XmlSerializer(list.GetType());
  TextWriter writer = new StreamWriter("serialized.xml");
  ser.Serialize(writer, list);
}

样本输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ArrayOfString>
    <string>0</string>
    <string>1</string>
    <string>2</string>
    <string>3</string>
    <string>4</string>
    <string>5</string>
    <string>6</string>
    <string>7</string>
    <string>8</string>
    <string>9</string>
  </ArrayOfString>
  
  ...

基于序列化的XML,Java反序列化:

代码语言:javascript
复制
// NEEDED IMPORTS
import java.io.*;
import java.util.*;
import org.jdom2.*;
import org.jdom2.input.*;

public static void main(String[] args) throws JDOMException, IOException {
    // build DOM from the XML file - generic for all XML files
    File fXmlFile = new File("serialized.xml"); // file we created in C#
    SAXBuilder builder = new SAXBuilder();
    Document document = builder.build(fXmlFile);
    Element root = document.getRootElement();
    
    // build List<List<String>> using expected format
    if(!root.getName().equals("ArrayOfArrayOfString")){
        System.out.println("invalid root element");
        return; 
    }
    
    List<List<String>> list = new ArrayList<>();
    
    List<Element> children = root.getChildren();
    for(int i = 0; i<children.size(); i++){
        Element child = children.get(i);
        if(child.getName().equals("ArrayOfString")){
            List<String> innerList = new ArrayList<>();
            list.add(innerList);
            List<Element> innerChildren = child.getChildren();
            for(int j=0; j < innerChildren.size(); j++){
                Element elem = innerChildren.get(j);
                if(elem.getName().equals("string"))
                    innerList.add(elem.getValue());
            }
        }
    }
    
    for(int i = 0; i<list.size(); i++){
        System.out.print(String.format("InnerList[%d]: ", i));
        List<String> innerList = list.get(i);
        for(int j=0; j<innerList.size(); j++)
            System.out.print(String.format("\"%s\" ",innerList.get(j)));
        System.out.println();
    }
}

输出:

InnerList:"0“"1”"2“"3”"4“"5”"6“7”8“"9” InnerList1:"10“"11”"12“"13”"14“"15”"16“17”18“"19” InnerList2:"20“"21”"22“"23”"24“"25”"26“27”28“"29” InnerList3:"30“"31”"32“"33”"34“"35”"36“37”38“"39” InnerList4:"40“"41”"42“"43”"44“45”46“47”48“"49” InnerList5:"50“"51”"52“"53”"54“"55”"56“57”58“"59” InnerList6:"60“"61”"62“"63”"64“"65”"66“67”68“"69” InnerList7:"70“"71”"72“"73”"74“75”76“77”78“"79” InnerList8:"80“"81”"82“"83”"84“"85”"86“"87”"88“"89” InnerList9:"90“"91”"92“"93”"94“"95”"96“97”98“"99”

这是一个非常简单的演示,演示了如何使用XML进行操作。我不会在这段代码中做错误处理。

编辑: Java构建器不是直接来自JDK的。您需要从他们的网站下载它:http://www.jdom.org/downloads/,并将jre文件导入到您的jre项目中。我还包括了此操作所需的import语句。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54749017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档