資料庫之序列化和反序列化
資料庫的加強版,牢記序列化和反序列化
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