1. 程式人生 > >資料庫之序列化和反序列化

資料庫之序列化和反序列化

資料庫的加強版,牢記序列化和反序列化

using System;
using MySql.Data;
using System.Data;
using System.IO;
using MySql.Data.MySqlClient;
using System.Text.RegularExpressions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace DataMgrTest
{
    public class Player
    {
       public
string id; public PlayerData data; public Player() { data = new PlayerData(); } } [Serializable] public class PlayerData{ public int age=0; public string name = ""; } public class DataMgr { MySqlConnection sqlConn; public
static DataMgr instance; public DataMgr() { instance = this; Connect(); } public void Connect() { string connStr = "Database=test;Data Source=127.0.0.1;"; connStr += "User Id=root;Password=123;port=3306"
; sqlConn = new MySqlConnection(connStr); try { //開啟資料 sqlConn.Open(); } catch (Exception e) { Console.Write("[DataMgr]Connect " + e.Message); return; } } public bool CanRegister(string id) { if (!IsSafe (id)) { return false; } //定義SQl語句 string cmdStr = string.Format("select * from user where id='{0}';", id); MySqlCommand cmd = new MySqlCommand (cmdStr, sqlConn); try { //執行查 MySqlDataReader dataReader = cmd.ExecuteReader (); bool hasRows = dataReader.HasRows; dataReader.Close(); return !hasRows; } catch(Exception e) { Console.WriteLine("[DataMgr]CanRegister fail " + e.Message); return false; } } public bool IsSafe(string str){ return !Regex.IsMatch(str, @"[-|;|,|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\']"); } public bool Register(string id, string pw) { //防sql注入 if (!IsSafe (id) || !IsSafe (pw)) { Console.WriteLine("[DataMgr]Register 使用非法字元"); return false; } //能否註冊 if (!CanRegister(id)) { Console.WriteLine("[DataMgr]Register !CanRegister+不能註冊"); return false; } //寫入資料庫User表 string cmdStr = string.Format("insert into user set id ='{0}' ,pwd ='{1}';", id, pw); MySqlCommand cmd = new MySqlCommand(cmdStr, sqlConn); try { cmd.ExecuteNonQuery(); return true; } catch(Exception e) { Console.WriteLine("[DataMgr]Register " + e.Message); return false; } } //建立角色 public bool CreatePlayer(string id) { //防sql注入 if (!IsSafe(id)) return false; //序列化 IFormatter formatter = new BinaryFormatter (); MemoryStream stream = new MemoryStream (); PlayerData data = new PlayerData (); try { formatter.Serialize(stream, data); } catch(Exception e) { Console.WriteLine("[DataMgr]CreatePlayer 序列化 " + e.Message); return false; } byte[] byteArr = stream.ToArray(); //寫入資料庫 string cmdStr = string.Format ("insert into player set id ='{0}',playerdata [email protected];",id); MySqlCommand cmd = new MySqlCommand (cmdStr, sqlConn); //新增命令引數 cmd.Parameters.Add ("@data", MySqlDbType.Blob); //新增對應命令引數的值, cmd.Parameters[0].Value = byteArr; cmd.Parameters.Add("@data", MySqlDbType.Blob); //新增對應命令引數的值, cmd.Parameters[0].Value = byteArr; try { cmd.ExecuteNonQuery (); return true; } catch (Exception e) { Console.WriteLine("[DataMgr]CreatePlayer 寫入 " + e.Message); return false; } } //檢測使用者名稱密碼 public bool CheckPassWord(string id, string pw) { //防sql注入 if (!IsSafe(id) || !IsSafe(pw)) return false; //查詢語句 string cmdStr = string.Format("select * from user where id='{0}' and pwd='{1}';", id, pw); //構建查詢命令類 MySqlCommand cmd = new MySqlCommand(cmdStr, sqlConn); try { //查詢 MySqlDataReader dataReader = cmd.ExecuteReader(); bool hasRows = dataReader.HasRows; dataReader.Close(); return hasRows; } catch (Exception e) { Console.WriteLine("[DataMgr]CheckPassWord " + e.Message); return false; } } //獲取玩家資料 public PlayerData GetPlayerData(string id) { PlayerData playerData = null; //防sql注入 if (!IsSafe(id)) return playerData; //查詢 string cmdStr = string.Format("select * from player where id ='{0}';", id); MySqlCommand cmd = new MySqlCommand(cmdStr, sqlConn); byte[] buffer; try { MySqlDataReader dataReader = cmd.ExecuteReader(); if (!dataReader.HasRows) { dataReader.Close(); return playerData; } //開始讀取緩衝區的資料 dataReader.Read(); //playerdata資料第二列,它的索引是1 //0代表是第一行 //null代表不向任何位元組陣列中寫入 //buffer = new byte[1024]; //目的就是得到陣列的長度 long len = dataReader.GetBytes(1, 0, null, 0, 0);//1是data //構建buffer陣列 buffer = new byte[len]; dataReader.GetBytes(1, 0, buffer, 0, (int)len); dataReader.Close(); } catch (Exception e) { Console.WriteLine("[DataMgr]GetPlayerData 查詢 " + e.Message); return playerData; } //反序列化 MemoryStream stream = new MemoryStream(buffer); try { IFormatter formatter = new BinaryFormatter(); playerData = (PlayerData)formatter.Deserialize(stream); return playerData; } catch (SerializationException e) { Console.WriteLine("[DataMgr]GetPlayerData 反序列化 " + e.Message); return playerData; } } public bool SavePlayer(Player player) { string id = player.id; PlayerData playerData = player.data; //序列化 IFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); try { // formatter.Serialize(stream, playerData); } catch (Exception e) { Console.WriteLine("[DataMgr]SavePlayer 序列化 " + e.Message); return false; } byte[] byteArr = stream.ToArray(); //寫入資料庫 string cmdStr = string.Format ("update player set data [email protected] where id = '{0}';", player.id); MySqlCommand cmd = new MySqlCommand(cmdStr, sqlConn); cmd.Parameters.Add("@data", MySqlDbType.Blob); cmd.Parameters[0].Value = byteArr; try { cmd.ExecuteNonQuery(); return true; } catch (Exception e) { Console.WriteLine("[DataMgr]CreatePlayer 寫入 " + e.Message); return false; } } } }

相關推薦

資料庫序列序列

資料庫的加強版,牢記序列化和反序列化 using System; using MySql.Data; using System.Data; using System.IO; using MySql.Data.MySqlClient; using System.

python學習day4路文件的序列序列

data 多次 文件交互 由於 mps logs json tro 之路 json和pickle序列化和反序列化   json是用來實現不同程序之間的文件交互,由於不同程序之間需要進行文件信息交互,由於用python寫的代碼可能要與其他語言寫的代碼進行數據傳輸,json支持

python基礎繼承組合應用、對象序列序列,選課系統綜合示例

sel 初始 否則 通用 __init__ period 類型 反序列化 信息 繼承+組合應用示例 1 class Date: #定義時間類,包含姓名、年、月、日,用於返回生日 2 def __init__(self,name,year,mon,day):

Java Serializable 序列序列的概念,作用的通俗易懂的解釋

計算 transient 全部 序列化對象 語義 meta person int 較高的 遇到這個 Java Serializable 序列化這個接口,我們可能會有如下的問題a,什麽叫序列化和反序列化b,作用。為啥要實現這個 Serializable 接口,也就是為啥要序列

Java Serializable 序列序列的概念 通俗易懂!!!

轉自: https://blog.csdn.net/qq_27093465/article/details/78544505 遇到這個 Java Serializable 序列化這個介面,我們可能會有如下的問題a,什麼叫序列化和反序列化 b,作用。為啥要實現這個 Serializable

二叉樹序列序列

分析:使用先序遍歷,假設序列化的結果字串為str,初始為str=""。如果遇到null就在str的結尾加”#!”,“#”表示這個節點為空,節點值不存在,"!”表示一個值的結束;如果遇到不為空的節點,在每一個節點值的後面都要加上"!",防止值疊加在一起,因為分層會出錯。反序列化,重構二叉樹,按照先序遍

Java基礎IO流(位元組流、字元流、記憶體流、帶快取的流、序列序列

File類:File類提供了對檔案的操作,可以通過字串或URI來構建一個File類物件。通過物件,可以實現檔案的建立(createNewFile)、刪除(delete)、獲得檔名(getName)、獲得父目錄物件(getParentFile)、獲得父目錄名稱(

java IO 位元組流、字元流操作總結三字元流、序列序列

這一篇我講介紹一下字元流。什麼是字元流,就是若干個位元組組成一個字元。(為什麼說是若干個,不能確定嗎)這裡就來說說原因和編碼問題。 首先說說字元編碼的問題,比較常用的編碼有gbk,utf-8等。 a、.編碼問題(看前面所描述的)。 1、gbk 編碼中文佔用2個位元組,英文

【轉】【UNITY3D 遊戲開發五】Google-protobuf與FlatBuffers資料的序列序列

★protobuf有啥缺陷?前幾天剛剛在“光環效應 ”的帖子裡強調了“要同時評估優點和缺點”。所以俺最後再來批判一下這玩意兒的缺點。◇應用 不夠廣由於protobuf剛公佈沒多久,相比XML而言,protobuf還屬於初出茅廬。因此,在知名度、應用廣度等方面都遠不如XML。由於這個原因,假如你設計的系統需要提

【UNITY3D 遊戲開發五】Google-protobuf與FlatBuffers資料的序列序列

 關於Protobuf 通過本文的轉載和分享的相關連結,足夠了解使用了,所以這裡不贅述了。但是這裡Himi順便提一下“FlatBuffers” ,它是 Protocol Buffers升級版,其主要區別在於FlatBuffers在訪問資料前不需要解析/拆包這一步。

Kubernetes官方java客戶端二:序列序列問題

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

C# Json序列序列

ava script brush arp turn bject new c# 序列化 using System.Web.Script.Serialization; public class JsonHelper { public static string Ob

序列序列

之前 字符 htm ive XML 文章 傳輸 c# clas 序列化 (Serialization)將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。 對象本身是在內存中存在的,想要儲存或者傳輸,就要把對象變成xml或者json或者二進制碼或者字符串等文件。然後就可以下次

java中什麽是序列序列

zab question .com 程序 還原 破壞 ans 但我 實現 序列化:能夠把一個對象用二進制的表示出來。 類似我第一個字節表示什麽屬性名詞,第二個字節表示什麽屬性值,第幾個字段表示有幾個屬性等。 而且這個二進制可以寫到硬

json對象的序列序列

name .cn .net序列化 object cnblogs json log con com //Json.NET序列化 string jsonData = JsonConvert.SerializeObject(對象model);

基於Json序列序列通用的封裝

result .html stream ctr 相似性 tac ram 等等 newton 1. 最近項目已經上線了 ,閑暇了幾天 想將JSON的序列化以及反序列化進行重新的封裝一下本人定義為JSONHelp,雖然Microsoft 已經做的很好了。但是我想封裝一套為自己開

ASP.NET 中JSON 的序列序列

urn 序列 del nbsp parseint 代碼 href end user JSON是專門為瀏覽器中的網頁上運行的JavaScript代碼而設計的一種數據格式。在網站應用中使用JSON的場景越來越多,本文介紹ASP.NET中JSON的序列化和反序列化,主要對JSON

對象序列序列的基本操作

bsp 序列 log png .cn ima images mage alt 對象序列化和反序列化的基本操作

json/pickle- 序列序列

內部 int strong 回來 color lex 數據類型 硬盤 json json只能處理簡單的數據類型。列表,字典,字符串等。函數不行。用於不同語言之間的相互轉化。 編碼:把一個Python對象編碼轉換成Json字符串 json.dumps() 把內存的數據對象

Python學習心得(五) random生成驗證碼、MD5加密、pickle與json的序列序列

用法 div com ict file imp randint csdn == # -*- coding:utf-8 -*- import random as rd #驗證碼 import hashlib as hsl #MD5加密 import pickle,json