二进制和XML的序列化和反序列化&&AB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public static class InfoNeed
{
    public static readonly string path = Path.Combine(Application.dataPath, "StreamingAssets");
}

 ##########

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
public class BuildAssetsBundle
{
    [MenuItem("Tools/BuildAB")]
    public static void Build()
    {
        string outPath = InfoNeed.path;
        if (Directory.Exists(outPath))
        {
            Directory.Delete(outPath,true);
        }
        Directory.CreateDirectory(outPath);

        BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);


        AssetDatabase.Refresh();
    }
}

#########

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml.Serialization;
using System;

[Serializable]
public class TestSerilize  {

    [XmlAttribute("MyId")]
    private int id;
    public int MyId { get { return id; } set { id = value; } }
    [XmlAttribute("MyName")]
    private string name;
    public string MyName { get { return name; } set { name = value; } }
    [XmlAttribute("MyGrade")]
    private List<Grade> grade=new List<Grade>();
    public List<Grade> MyGrade { get { return grade; } set { grade = value; } }
}
[Serializable]
public class Grade
{
    [SerializeField]
    public int chinese;
    [SerializeField]
    public int math;
}

 

######

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class TestLoad : MonoBehaviour
{

    TestSerilize testSerilize = new TestSerilize();
    // Use this for initialization
    void Start()
    {
        //TestSerilizeXML(testSerilize);
        //TestDeSerilizeXML();
        //BinarySerilizeTest(testSerilize);
        //BinaryDeserilizeTest();
        //TestAssets();
    }
    void TestAssets()
    {
        AssetsSerlize AS = UnityEditor.AssetDatabase.LoadAssetAtPath<AssetsSerlize>("Assets/TestAssets.asset");
        Debug.Log(AS.ID);
        Debug.Log(AS.Name);
        Debug.Log(AS.Grade[0]);
    }
    void TestLoadAB()
    {
        AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/cube.unity3d");
        Instantiate(assetBundle.LoadAsset<GameObject>("cube"));

    }
    #region XML
    /// <summary>
    /// 序列化XML
    /// </summary>
    /// <param name="testSerilize"></param>
    void TestSerilizeXML(TestSerilize testSerilize)
    {
        InitXML();

        FileStream fileStream = new FileStream(Application.dataPath + "/Test.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
        StreamWriter sw = new StreamWriter(fileStream, System.Text.Encoding.UTF8);
        XmlSerializer xml = new XmlSerializer(testSerilize.GetType());
        xml.Serialize(sw, testSerilize);
        sw.Close();
        fileStream.Close();
    }
    /// <summary>
    /// 反向序列化XML
    /// </summary>
    /// <returns></returns>
    TestSerilize DeserilizeXML()
    {
        FileStream fileStream = new FileStream(Application.dataPath + "/Test.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

        XmlSerializer xs = new XmlSerializer(typeof(TestSerilize));
        TestSerilize testSerilize = (TestSerilize)xs.Deserialize(fileStream);

        fileStream.Close();
        return testSerilize;
    }

    void TestDeserilizeXML()
    {
        TestSerilize testSerilizeObj = DeserilizeXML();
        Debug.Log("testSerilizeObj.MyId==" + testSerilizeObj.MyId);
        Debug.Log("testSerilizeObj.MyName==" + testSerilizeObj.MyName);
        Debug.Log("testSerilizeObj.MyGrade1.chinese==" + testSerilizeObj.MyGrade[0].chinese);
        Debug.Log("testSerilizeObj.MyGrade2.math==" + testSerilizeObj.MyGrade[1].math);
    }
    void InitXML()
    {
        testSerilize.MyId = 1;
        testSerilize.MyName = "TestXML";

        Grade grade1 = new Grade();
        grade1.chinese = 1;
        grade1.math = 2;
        Grade grade2 = new Grade();
        grade2.chinese = 3;
        grade2.math = 4;

        testSerilize.MyGrade.Add(grade1);
        testSerilize.MyGrade.Add(grade2);
    }
    #endregion
    #region 二进制
    void BinarySerilizeTest(TestSerilize testSerilize)
    {
        InitBinary();
        using (FileStream fs = new FileStream(Application.dataPath + "/Test.bytes", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, testSerilize);
        }
    }
    TestSerilize BinaryDeserilize()
    {
        TextAsset textAsset = UnityEditor.AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Test.bytes");

        MemoryStream ms = new MemoryStream(textAsset.bytes);
        BinaryFormatter bf = new BinaryFormatter();
        TestSerilize testSerilize = (TestSerilize)bf.Deserialize(ms);
        ms.Close();
        return testSerilize;
    }
    void BinaryDeserilizeTest()
    {
        TestSerilize testSerilizeObj = BinaryDeserilize();
        Debug.Log("testSerilizeObj.MyId==" + testSerilizeObj.MyId);
        Debug.Log("testSerilizeObj.MyName==" + testSerilizeObj.MyName);
        Debug.Log("testSerilizeObj.MyGrade1.chinese==" + testSerilizeObj.MyGrade[0].chinese);
        Debug.Log("testSerilizeObj.MyGrade2.math==" + testSerilizeObj.MyGrade[1].math);
    }
    void InitBinary()
    {
        testSerilize.MyId = 2;
        testSerilize.MyName = "TestBinary";

        Grade grade10 = new Grade();
        grade10.chinese = 10;
        grade10.math = 20;
        Grade grade20 = new Grade();
        grade20.chinese = 30;
        grade20.math = 40;

        testSerilize.MyGrade.Add(grade10);
        testSerilize.MyGrade.Add(grade20);
    }
    #endregion
}

#######

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName ="TestAssets",menuName ="CreateAssets",order =0)]
public class AssetsSerlize : ScriptableObject {

    public int ID;
    public string Name;
    public List<int> Grade;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二进制XML存储方案BinXML实现方法 BinXML是我个人杜撰出来的名字,不知道是否合适,也不知道是否已存在类似的解决方案。在vcer.net上我将前一段时间的这个BinXML方案贡献出来,希望能够与广大vcer分享。 当时问题的背景是这样的,项目需要确定存储方案,这种方案需要满足如下要求: · 生成的单机板exe尽可能的不依赖于其它软件,如:数据库管理系统; · 存储的数据最好能够方便的拷贝,以满足项目的上报、汇总的功能; · 存储的格式以后可能还会变,变化不频繁,但是最好能支持这种变化; · 只需要数据的持久化与反持久化的功能,不需要查询统计等复杂功能; · 存储的数据中可能包括一个或者多个的文件附件,如:word文档; · 存储的数据可能被不同的平台使用,如:windows或者linux; · 作为web项目的一部分,除了提供VC的接口之外,存储的数据格式需要提供java的接口; 我首先考虑到了MsAccess格式,文件型数据库,方便拷贝,而且表的设计很柔性化。在windows环境下,MsAccess似乎可以不需要再安装额外的驱动,但是在linux环境下,如何被java调用是个问题(当然,这个问题也是可以解决的,但是很别扭)。其次,使用RDB还有一个问题:数据的层次表达与多值问题,将树型数据扁平化存储的方案是有的,但是,将几层简单的节点拆分成N个表格,岂不是杀鸡用牛刀? 其次的考虑当然是XML,然而XML是基于可读文本的,如何解决二进制数据问题?当然可以通过编码的途径来解决,但是这样使用XML是不是太牵强了?而且,XML有个缺陷,数据都是文本型的。要使用数值型、布尔型、日期型的数据,需要做进一步的解析。 那么就使用自定义的数据文件格式?传统情况下,我们会用一个或者若干个struct将数据打包,一下子塞进文件。但是现在用户说了:我们现在定义的数据结构可能会变:) 看来,我们的存储方案还必须要足够的柔性化。 想到最后,我决定还是借鉴XML的树型标签形式,来实现一种二进制的存储结构,即BinXML:) 关于src包 对于BinXML-src里面的例子,数据的结构类似于: BinXML-src.zip包括两部分,一部分是vc的工程,一部分是java的工程,在Visual C++6.0和eclipse+JDK1.4中都已编译、运行通过。大家可以运行BinXML-bin.zip里面的exe程序,测试一下BinXML文件的加载和保存功能。 对象模型 BinXML的对象模型主要包括:文档(document)和节点(node)。每个文档包含一个根节点(root),根节点下面包含一个或者多个子节点,如此类推。 文档包含一个文件头,其中包含了一些标识串、操作系统版本、文件大小、文档创建时间等信息。 每个节点也包含一个节点头,表明该节点的名称以及大小。一般来说,用户不会直接接触到文件头和节点头这些信息。 如下为VC里的类声明: 在java里,定义了binxml.io包,其中的类、接口定义与以上相似。 你很容易想到,使用BinXML,可以很方便地完成CTreeCtrl的持久化。 如何使用? 如下是VC中加载BinXML的代码片断: 对应的,写入BinXML的代码片断: 是不是很简单?在java里面,BinXML的一个测试用例: TODO 希望BinXML能给你带来一定的帮助和启发,更多的是希望能带来启发:)希望有兴趣的哥们继续完善BinXML,别忘了在你的大名之前保留我的版权信息: BinXML需要完善的地方表现在: · 暂时只实现了string/long/byte[],还没有提供其它类型的解析与转换; · XML标签不支持属性,只支持子元素:) · 是不是可以提供一个oxm模型,完成BinXML与Object之间的直接映射,现在这个映射工作还是人工代码实现的,譬如:GetString/GetLong,等等。应该可以完善一个映射机制,自动根据定义好的类型进行转换;
C#中可以使用二进制流进行对象的序列化反序列化操作。对于序列化操作,可以使用IFormatter的Serialize方法将对象序列化为byte[]。具体的方法如下所示: ``` public static byte[] FormatterObjectBytes(object obj) { if(obj == null) throw new ArgumentNullException("obj"); byte[] buff; try { using(var ms = new MemoryStream()) { IFormatter iFormatter = new BinaryFormatter(); iFormatter.Serialize(ms, obj); buff = ms.GetBuffer(); } } catch(Exception ex) { throw new Exception(ex.Message); } return buff; } ``` 而对于反序列化操作,则可以使用IFormatter的Deserialize方法将byte[]反序列化为对象。具体的方法如下所示: ``` public static object FormatterByteObject(byte[] buff) { if(buff == null) throw new ArgumentNullException("buff"); object obj; try { using(var ms = new MemoryStream()) { IFormatter iFormatter = new BinaryFormatter(); obj = iFormatter.Deserialize(ms); } } catch(Exception ex) { throw new Exception(ex.Message); } return obj; } ``` 通过使用这两个方法,我们可以在C#中对对象进行二进制流的序列化反序列化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C#二进制流的序列化反序列化操作](https://blog.csdn.net/weixin_33923762/article/details/92329340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值