C# 如何在C中将ExpandooObject的动态列表转换为字节# 目标 将当前动态对象保存到文件 加载保存并设置它

C# 如何在C中将ExpandooObject的动态列表转换为字节# 目标 将当前动态对象保存到文件 加载保存并设置它,c#,dynamic,byte,C#,Dynamic,Byte,我搜索并找到了下面的方法。但它是针对可序列化字段/类的 可序列化 public byte[]ToByteArray(T obj) { BinaryFormatter b=新的BinaryFormatter() 使用(MemoryStream m=新的MemoryStream) { b、 序列化(m,obj); 返回ToArray女士(); } } 公共T FromByteArray(字节[]数据) { BinaryFormatter b=新的BinaryFormatter() 使用(Memory

我搜索并找到了下面的方法。但它是针对可序列化字段/类的

可序列化
public byte[]ToByteArray(T obj)
{
BinaryFormatter b=新的BinaryFormatter()
使用(MemoryStream m=新的MemoryStream)
{
b、 序列化(m,obj);
返回ToArray女士();
}
}
公共T FromByteArray(字节[]数据)
{
BinaryFormatter b=新的BinaryFormatter()
使用(MemoryStream m=新的MemoryStream)
{
对象obj=b.反序列化(m);
返回(T)obj;
}
}
目标示例 动态d不能是可序列化的类,因为它不只有x、y和z。我的目标是创建两个函数:将动态列表保存到文件并从文件加载

  • bool-ToFile列表列表,字符串其中)
  • 列表加载字符串其中)
List save=new List();
动态d=新的ExpandooObject();
d、 x=1;
d、 y=3;
保存。添加(d);
d、 z=5;
d、 _type=“1”;
保存。添加(d);
ToFile(保存,“C:/save.byte”);
列表加载=加载(“C:/Save.byte”);
for(int I=0;I
安慰
我知道,从算法的角度来看,这不是您所期望的,但是下面的解决方案达到了声明的目标。首先,在您的示例中,列表中的两个项目都是相同的项目。我将主代码更改为:

var bs = new BinaryStorage();
List<dynamic> save = new List<dynamic>();

dynamic d = new ExpandoObject();
d.x = 1;
d.y = 3;
d.name = "You can also add text of any length here";
save.Add(d);

dynamic e = new ExpandoObject();
e.z = 5;
e._type = "1";
save.Add(e);

bs.writeToFile(save, "data.bin");

List<dynamic> load = bs.readFromFile("data.bin");
int i = 0;
foreach (var item in load)
{
  i++;
  Console.WriteLine(item.z == null ? $"{i}: (null)" : $"{i}: {item.z}");
}
var bs=new BinaryStorage();
列表保存=新建列表();
动态d=新的ExpandooObject();
d、 x=1;
d、 y=3;
d、 name=“您也可以在此处添加任意长度的文本”;
保存。添加(d);
动态e=新的ExpandoObject();
e、 z=5;
e、 _type=“1”;
保存。添加(e);
b.writeToFile(保存“data.bin”);
列表加载=bs.readFromFile(“data.bin”);
int i=0;
foreach(加载中的var项目)
{
i++;
WriteLine(item.z==null?$“{i}:(null)”:$“{i}:{item.z}”);
}
BinaryStorage类如下所示:

public class BinaryStorage
{
  // add methods CopyTo, Zip, and Unzip

  public void writeToFile(List<dynamic> data, string fname)
  {
    string jtext = JsonConvert.SerializeObject(data, Formatting.None);
    File.WriteAllBytes(fname, Zip(jtext));
  }

  public List<dynamic> readFromFile(string fname)
  {
    var bin = File.ReadAllBytes(fname);
    var res = JsonConvert.DeserializeObject<List<dynamic>>(Unzip(bin));
    return res;
  }
}
公共类二进制存储
{
//添加CopyTo、Zip和Unzip方法
public void writeToFile(列表数据,字符串fname)
{
字符串jtext=JsonConvert.SerializeObject(数据,格式化.None);
writealBytes(fname,Zip(jtext));
}
公共列表readFromFile(字符串fname)
{
var bin=File.ReadAllBytes(fname);
var res=JsonConvert.DeserializeObject(解压(bin));
返回res;
}
}
此示例生成99字节的data.bin文件。本课程的其他三种方法可从以下答案中选择:


请注意,您将同一对象添加到
保存列表中两次。
public class BinaryStorage
{
  // add methods CopyTo, Zip, and Unzip

  public void writeToFile(List<dynamic> data, string fname)
  {
    string jtext = JsonConvert.SerializeObject(data, Formatting.None);
    File.WriteAllBytes(fname, Zip(jtext));
  }

  public List<dynamic> readFromFile(string fname)
  {
    var bin = File.ReadAllBytes(fname);
    var res = JsonConvert.DeserializeObject<List<dynamic>>(Unzip(bin));
    return res;
  }
}