Save and Load from XML

保存工程的信息:比如游戏进程中的位置信息,对抗双方的个人信息等:

方法1:使用xml文件:

  xml文件要以UTF-8的格式存储;

  但是这样做会使得programmer 可以从脚本中控制xml文件中的所有的字符,包括xml文件中的语法命令字符,因此会带来不安全隐患;

  附上两段代码:

  A 这一段是我自己写的,将一个xml文件按照字符串读入;

  虽然unity3d中的string类型说明中讲到保存的是unicode characters,但是实际上当xml文件比较大的时候,如果保存成unicode,就读不出来,如果保存成UTF-8就不存在这个问题;

  using UnityEngine;
using System.Collections;

public class ReadXML: MonoBehaviour {
 
 //store the read in file
 WWW statusFile;
 
 //decide wether the reading of  xml has been finished
    bool isReadIn = false;

 // Use this for initialization
 IEnumerator Start () {//不能用void,否则没有办法使用yield
  isReadIn = false;
  yield return StartCoroutine(ReadIn());
  isReadIn = true;
 }
 
 IEnumerator ReadIn()
 {
  yield return statusFile = new WWW("file:///D:/unity/rotationAndcolor/Assets/information/testxml.xml");//注意路径的写法
 }
 
 // Update is called once per frame
 void Update () {
  if(isReadIn)
  {
   string statusData = statusFile.data;
   print(statusData.Length);
   }

 }
 
 //get the parameters in the xml file
 void getPatameters(string _xmlString)
 {
  //_xmlString.[0] 
  }
 
 void postParameters()
 {
  
  }
}

 

B 这一段代码来自http://www.unifycommunity.com/wiki/index.php?title=Save_and_Load_from_XML

 

using UnityEngine;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;

public class _GameSaveLoad: MonoBehaviour {

   // An example where the encoding can be found is at
   // http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp
   // We will just use the KISS method and cheat a little and use
   // the examples from the web page since they are fully described
   
   // This is our local private members
   Rect _Save, _Load, _SaveMSG, _LoadMSG;
   bool _ShouldSave, _ShouldLoad,_SwitchSave,_SwitchLoad;
   string _FileLocation,_FileName;
   public GameObject _Player;
   UserData myData;
   string _PlayerName;
   string _data;
   
   Vector3 VPosition;
   
   // When the EGO is instansiated the Start will trigger
   // so we setup our initial values for our local members
   void Start () {
      // We setup our rectangles for our messages
      _Save=new Rect(10,80,100,20);
      _Load=new Rect(10,100,100,20);
      _SaveMSG=new Rect(10,120,400,40);
      _LoadMSG=new Rect(10,140,400,40);
       
      // Where we want to save and load to and from
      _FileLocation=Application.dataPath;
      _FileName="SaveData.xml";
   
      // for now, lets just set the name to Joe Schmoe
      _PlayerName = "Joe Schmoe";
       
      // we need soemthing to store the information into
      myData=new UserData();
   }
   
   void Update () {}
   
   void OnGUI()
   {   
       
   //***************************************************
   // Loading The Player...
   // **************************************************       
   if (GUI.Button(_Load,"Load")) {
       
      GUI.Label(_LoadMSG,"Loading from: "+_FileLocation);
      // Load our UserData into myData
      LoadXML();
      if(_data.ToString() != "")
      {
        // notice how I use a reference to type (UserData) here, you need this
        // so that the returned object is converted into the correct type
        myData = (UserData)DeserializeObject(_data);
        // set the players position to the data we loaded
        VPosition=new Vector3(myData._iUser.x,myData._iUser.y,myData._iUser.z);             
        _Player.transform.position=VPosition;
        // just a way to show that we loaded in ok
        Debug.Log(myData._iUser.name);
      }
   
   }
   
   //***************************************************
   // Saving The Player...
   // **************************************************   
   if (GUI.Button(_Save,"Save")) {
             
     GUI.Label(_SaveMSG,"Saving to: "+_FileLocation);
     myData._iUser.x=_Player.transform.position.x;
     myData._iUser.y=_Player.transform.position.y;
     myData._iUser.z=_Player.transform.position.z;
     myData._iUser.name=_PlayerName;   
         
     // Time to creat our XML!
     _data = SerializeObject(myData);
     // This is the final resulting XML from the serialization process
     CreateXML();
     Debug.Log(_data);
   }
   
   
   }
   
   /* The following metods came from the referenced URL */
   string UTF8ByteArrayToString(byte[] characters)
   {     
      UTF8Encoding encoding = new UTF8Encoding();
      string constructedString = encoding.GetString(characters);
      return (constructedString);
   }
   
   byte[] StringToUTF8ByteArray(string pXmlString)
   {
      UTF8Encoding encoding = new UTF8Encoding();
      byte[] byteArray = encoding.GetBytes(pXmlString);
      return byteArray;
   }
   
   // Here we serialize our UserData object of myData
   string SerializeObject(object pObject)
   {
      string XmlizedString = null;
      MemoryStream memoryStream = new MemoryStream();
      XmlSerializer xs = new XmlSerializer(typeof(UserData));
      XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
      xs.Serialize(xmlTextWriter, pObject);
      memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
      XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
      return XmlizedString;
   }
   
   // Here we deserialize it back into its original form
   object DeserializeObject(string pXmlizedString)
   {
      XmlSerializer xs = new XmlSerializer(typeof(UserData));
      MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
      XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
      return xs.Deserialize(memoryStream);
   }
   
   // Finally our save and load methods for the file itself
   void CreateXML()
   {
      StreamWriter writer;
      FileInfo t = new FileInfo(_FileLocation+"//"+ _FileName);
      if(!t.Exists)
      {
         writer = t.CreateText();
      }
      else
      {
         t.Delete();
         writer = t.CreateText();
      }
      writer.Write(_data);
      writer.Close();
      Debug.Log("File written.");
   }
   
   void LoadXML()
   {
      StreamReader r = File.OpenText(_FileLocation+"//"+ _FileName);
      string _info = r.ReadToEnd();
      r.Close();
      _data=_info;
      Debug.Log("File Read");
   }
}

// UserData is our custom class that holds our defined objects we want to store in XML format
 public class UserData
 {
    // We have to define a default instance of the structure
   public DemoData _iUser;
    // Default constructor doesn't really do anything at the moment
   public UserData() { }
   
   // Anything we want to store in the XML file, we define it here
   public struct DemoData
   {
      public float x;
      public float y;
      public float z;
      public string name;
   }
}

 

以下是javascript版本

import System;
import System.Collections;
import System.Xml;
import System.Xml.Serialization;
import System.IO;
import System.Text;

// Anything we want to store in the XML file, we define it here
class DemoData
{
    var x : float;
   
var y : float;
   
var z : float;
   
var name : String;
}

// UserData is our custom class that holds our defined objects we want to store in XML format
 class UserData
 
{
    // We have to define a default instance of the structure
   public var _iUser : DemoData = new DemoData();
   
// Default constructor doesn't really do anything at the moment
   function UserData() { }
}

//public class GameSaveLoad: MonoBehaviour {

// An example where the encoding can be found is at
// http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp
// We will just use the KISS method and cheat a little and use
// the examples from the web page since they are fully described

// This is our local private members
private var _Save : Rect;
private var _Load : Rect;
private var _SaveMSG : Rect;
private var _LoadMSG : Rect;
//var _ShouldSave : boolean;
//var _ShouldLoad : boolean;
//var _SwitchSave : boolean;
//var _SwitchLoad : boolean;
private var _FileLocation : String;
private var _FileName : String = "SaveData.xml";

//public GameObject _Player;
var _Player : GameObject;
var _PlayerName : String = "Joe Schmoe";

private var myData : UserData;
private var _data : String;

private var VPosition : Vector3;

// When the EGO is instansiated the Start will trigger
// so we setup our initial values for our local members
//function Start () {
function Awake () { 
     
// We setup our rectangles for our messages
      _Save=new Rect(10,80,100,20);
      _Load=
new Rect(10,100,100,20);
      _SaveMSG=
new Rect(10,120,200,40);
      _LoadMSG=
new Rect(10,140,200,40);
       
     
// Where we want to save and load to and from
      _FileLocation=Application.dataPath;
     
         
     
// we need soemthing to store the information into
      myData=new UserData();
   
}
   
function Update () {}
   
function OnGUI()
{   

   
// ***************************************************
   // Loading The Player...
   // **************************************************       
   if (GUI.Button(_Load,"Load")) {
     
      GUI.
Label(_LoadMSG,"Loading from: "+_FileLocation);
     
// Load our UserData into myData
      LoadXML();
     
if(_data.ToString() != "")
      {
         // notice how I use a reference to type (UserData) here, you need this
         // so that the returned object is converted into the correct type
         //myData = (UserData)DeserializeObject(_data);
         myData = DeserializeObject(_data);
         
// set the players position to the data we loaded
         VPosition=new Vector3(myData._iUser.x,myData._iUser.y,myData._iUser.z);             
         _Player.
transform.position=VPosition;
         
// just a way to show that we loaded in ok
         Debug.Log(myData._iUser.name);
     
}
   
   
}
   
   
// ***************************************************
   // Saving The Player...
   // **************************************************   
   if (GUI.Button(_Save,"Save")) {
           
      GUI.
Label(_SaveMSG,"Saving to: "+_FileLocation);
     
//Debug.Log("SaveLoadXML: sanity check:"+ _Player.transform.position.x);
     
      myData._iUser.
x = _Player.transform.position.x;
      myData._iUser.
y = _Player.transform.position.y;
      myData._iUser.
z = _Player.transform.position.z;
      myData._iUser.
name = _PlayerName;   
       
     
// Time to creat our XML!
      _data = SerializeObject(myData);
     
// This is the final resulting XML from the serialization process
      CreateXML();
      Debug.
Log(_data);
   
}


}
   
/* The following metods came from the referenced URL */
//string UTF8ByteArrayToString(byte[] characters)
function UTF8ByteArrayToString(characters : byte[] )
{     
   
var encoding : UTF8Encoding  = new UTF8Encoding();
   
var constructedString : String  = encoding.GetString(characters);
   
return (constructedString);
}

//byte[] StringToUTF8ByteArray(string pXmlString)
function StringToUTF8ByteArray(pXmlString : String)
{
   var encoding : UTF8Encoding  = new UTF8Encoding();
   
var byteArray : byte[]  = encoding.GetBytes(pXmlString);
   
return byteArray;
}
   
   
// Here we serialize our UserData object of myData
   //string SerializeObject(object pObject)
function SerializeObject(pObject : Object)
{
   var XmlizedString : String  = null;
   
var memoryStream : MemoryStream  = new MemoryStream();
   
var xs : XmlSerializer = new XmlSerializer(typeof(UserData));
   
var xmlTextWriter : XmlTextWriter  = new XmlTextWriter(memoryStream, Encoding.UTF8);
   xs.
Serialize(xmlTextWriter, pObject);
   memoryStream = xmlTextWriter.
BaseStream; // (MemoryStream)
   XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
   
return XmlizedString;
}

   // Here we deserialize it back into its original form
   //object DeserializeObject(string pXmlizedString)
function DeserializeObject(pXmlizedString : String)   
{
   var xs : XmlSerializer  = new XmlSerializer(typeof(UserData));
   
var memoryStream : MemoryStream  = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
   
var xmlTextWriter : XmlTextWriter  = new XmlTextWriter(memoryStream, Encoding.UTF8);
   
return xs.Deserialize(memoryStream);
}

   // Finally our save and load methods for the file itself
function CreateXML()
{
   var writer : StreamWriter;
   
//FileInfo t = new FileInfo(_FileLocation+"//"+ _FileName);
   var t : FileInfo = new FileInfo(_FileLocation+"/"+ _FileName);
   
if(!t.Exists)
   {
      writer = t.CreateText();
   
}
   else
   {
      t.Delete();
      writer = t.
CreateText();
   
}
   writer.Write(_data);
   writer.
Close();
   Debug.
Log("File written.");
}
   
function LoadXML()
{
   //StreamReader r = File.OpenText(_FileLocation+"//"+ _FileName);
   var r : StreamReader = File.OpenText(_FileLocation+"/"+ _FileName);
   
var _info : String = r.ReadToEnd();
   r.
Close();
   _data=_info;
   Debug.
Log("File Read");
}

//}

方法2:使用unity 3d 的ISerializable类

它的好处是,可以将文件存成自己定义的后缀形式,并且2进制化存储,在u3d的帮助文档中有相关介绍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值