序列化的问题

shijies 2020-05-18 09:32:40
序列化指将一个对象转换成二进制代码?如果既有文本,又有图片和数据表,如何将他们保存到一个文件中?
...全文
368 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2020-05-26
  • 打赏
  • 举报
回复
二进制序列化处理太麻烦了,就别用了。其他的xml、json图像转码可以保存,其他包括c#里面的Color、Bitmap等等不可以直接序列化

using System.Runtime.Serialization.Json;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
/// 将对象序列化为json文件
public static void ObjectToJson<T>(T t, string path) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.WriteObject(stream, t);
}
}

/// 将对象序列化为json字符串
public static string ObjectToJson<T>(T t) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.WriteObject(stream, t);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
}

/// json字符串转成对象
public static T JsonToObject<T>(string json) where T : class
{
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
T result = formatter.ReadObject(stream) as T;
return result;
}
}

/// 将对象序列化为xml文件
public static void ObjectToXml<T>(T t, string path) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
////using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
using (FileStream stream = new FileStream(path, FileMode.Create))
{
formatter.Serialize(stream, t);
}
}

/// 将对象序列化为xml字符串
public static string ObjectToXml<T>(T t) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
}

/// 将xml文件反序列化为对象
public static T XmlToObject<T>(T t, string path) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
////using (FileStream stream = new FileStream(path, FileMode.Create))
{
XmlReader xmlReader = new XmlTextReader(stream);
T result = formatter.Deserialize(xmlReader) as T;
return result;
}
}

/// 将xml字符串反序列化为对象
public static T XmlStrToObject<T>(T t, string str) where T : class
{
XmlSerializer formatter = new XmlSerializer(typeof(T));

StringReader xmlReader = new StringReader(str);
T result = formatter.Deserialize(xmlReader) as T;
return result;
}


/// 将对象序列化为二进制流
public static byte[] ObjectToString<T>(T t)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
byte[] result = stream.ToArray();
return result;
}
}

/// 将二进制流反序列为类型
public static T StringToObject<T>(byte[] bytes) where T : class
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream(bytes, 0, bytes.Length))
{
T result = formatter.Deserialize(stream) as T;
return result;
}
}

/// 将对象序列化为文件
public static void ObjectToFile<T>(T t, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.Serialize(stream, t);
stream.Flush();
}
}

/// 将文件反序列化为对象
public static T FileToObject<T>(string path) where T : class
{
using (FileStream stream = new FileStream(path, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
T result = formatter.Deserialize(stream) as T;
return result;
}
}
}

前面贴了好多遍了。。
  • 打赏
  • 举报
回复
参考html文件
luj_1768 2020-05-24
  • 打赏
  • 举报
回复
序列化是否可以理解成:把指定的内容编译成字节码?这样便于传输、管理和安全,成本又不高;使用时只需要转译一下、就可使用,甚至有的还可以直接使用。
shijies 2020-05-21
  • 打赏
  • 举报
回复
可序列化对象和byte[]数组之间的互转
shijies 2020-05-21
  • 打赏
  • 举报
回复
就是将对象序列化成字节数组?
The 祺℡ 2020-05-21
  • 打赏
  • 举报
回复
byte[]长度就是占用字节,但是根据对象内容并不固定。 只能表头位置先记录对象的起始点和读取长度。
shijies 2020-05-21
  • 打赏
  • 举报
回复
不知道如何知道序列化以后占用的字节数,因为自定义格式是规定在某个位置存入对象,还需要知道存入的对象占用了多少字节,以便读取。
The 祺℡ 2020-05-21
  • 打赏
  • 举报
回复
https://www.cnblogs.com/answercard/p/4935160.html
The 祺℡ 2020-05-21
  • 打赏
  • 举报
回复
//C# 对象序列化 private static byte[] Serialize(object data) { BinaryFormatter formatter = new BinaryFormatter(); MemoryStream rems = new MemoryStream(); formatter.Serialize(rems, data); return rems.GetBuffer(); } 发的代码你是没看吗? 对于对象的信息存储,我一般是用上面的代码存为二进制文件。恢复的时候直接从二进制文件挂载回来。
The 祺℡ 2020-05-19
  • 打赏
  • 举报
回复
附验证代码: using System; using System.Data; using System.Drawing; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace csdnDemo { class Program { //需要存储的类 [Serializable] class A { public string Text; public Bitmap BM; public DataTable DT; } //Main static void Main(string[] args) { //实例化类A对象a A a = new A { Text = "Hello World", BM = new Bitmap(100, 100), DT = new DataTable("table name") }; //将对象二进制保存到“file.data”文件 File.WriteAllBytes("file.dat", Serialize(a)); //从“file.data”文件读取对象b信息 A b = Deserialize(File.ReadAllBytes("file.dat")) as A; //验证一下数据是否丢失 Console.WriteLine("Text = {0}", b.Text); Console.WriteLine("Bitmap Width = {0}", b.BM.Width); Console.WriteLine("DataTable Name = {0}", b.DT.TableName); } //C# 对象序列化 private static byte[] Serialize(object data) { BinaryFormatter formatter = new BinaryFormatter(); MemoryStream rems = new MemoryStream(); formatter.Serialize(rems, data); return rems.GetBuffer(); } //C# 对象反序列化 private static object Deserialize(byte[] data) { BinaryFormatter formatter = new BinaryFormatter(); MemoryStream rems = new MemoryStream(data); return formatter.Deserialize(rems); } } }
The 祺℡ 2020-05-19
  • 打赏
  • 举报
回复
定义类:将文本、图片、数据表都定义为类成员变量。类声明前加“[Serializable]”标记。 实例化对象之后,将对象序列化即可。 //C# 对象序列化 private static byte[] Serialize(object data) { BinaryFormatter formatter = new BinaryFormatter(); MemoryStream rems = new MemoryStream(); formatter.Serialize(rems, data); return rems.GetBuffer(); } //C# 对象反序列化 private static object Deserialize(byte[] data) { BinaryFormatter formatter = new BinaryFormatter(); MemoryStream rems = new MemoryStream(data); return formatter.Deserialize(rems); }
wanghui0380 2020-05-19
  • 打赏
  • 举报
回复
epub简介 https://www.jianshu.com/p/d2edab6750df 他本身就是zip文件,所以你不需要纠结什么在那里写多少字节的问题,zip格式自己描述。 而你需要构建文档,那么请构建那几个xml描述就好
wanghui0380 2020-05-19
  • 打赏
  • 举报
回复
很难知道你到底想干啥,从你上个帖子我们说你想做word,pdf,epub 但你提问的方式,我只认为你在纠结怎么做个zip,rar 想做word,pdf,epub请先弄明白“文档格式”,如果是这个,我建议你直接上epub把,起码epub是明文的,也不需要你纠结什么序列化,什么某个位置存多少字节
杀马特丶蛮牛 2020-05-19
  • 打赏
  • 举报
回复
图片存个路径,然后直接序列化,保存到文件

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧