C#将类序列化为未标记为可序列化的字节[]

我有如下类和我无法更改的类,因为这些类已有近20多年的历史了,并且已经在生产中被许多应用程序使用。 这是由团队维护的,在我去找他们进行改变之前,我认为这将是一个巨大的改变,我需要确保我探索所有选项。

[Serializable]
public class MyDTO
{
  public string FullName {get;set;}
  public List<Address> Addresses {get;set}
}

// Note: It is not marked as Serializable
public class Address
{
  public string FullAddress {get;set;}
  
}

我正在如下创建MyDTO

List<Address> myAddresses = new List<Address>()
{
   new Address() { FullAddress =" FullAddress1"},new Address() { FullAddress =" FullAddress2"}
}

MyDTO dto = new MyDTO() 
{
  FullName = "FullName",Addresses = myAddresses
}

现在我正尝试将dto转换为byte [],如下所示。

public byte[] SerializeToByteArray(MyDTO dto)
{
  byte[] byteArray = null;
  BinaryFormatter bf = new BinaryFormatter();
  using (MemoryStream ms = new MemoryStream())
  {
    bf.Serialize(ms,dto);
    byteArray = ms.ToArray();
  }
  return byteArray;
}

我正在因为 在程序集“ xxx.yyy.zzz,版本= 1.0.0.0,区域性=中性,公共密钥令牌=空”中的类型“ xxx.Address”未标记为可序列化。

任何人都可以告诉我如何在不将地址设置为可序列化的情况下解决此问题。 我需要将dto转换为byte []

谢谢。

更新1

我尝试了@Neil在评论中提出的建议,现在我的最初问题已解决(我认为是),但是我遇到了新问题,所以我觉得自己在做错了。

这就是我现在正在做的

public byte[] SerializeToByteArray<T>(T dto)
{
 byte[] byteArray = null;
 BinaryFormatter bf = new BinaryFormatter();
 using (MemoryStream ms = new MemoryStream())
 {
   bf.Serialize(ms,dto);
   byteArray = ms.ToArray()
 }
 return byteArray;
}
string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(dto);
byte[] byteArray = SerializeToByteArray(jsonString);
string dtoByteArrayBase64String = Convert.ToBase64String(byteArray);

我将dtoByteArrayBase64String发送到服务器端,并且正在接收它。 在服务器上,我尝试重新创建MyDTO对象,如下所示:

byte[] inputDTOByteArray = Convert.FromBase64String(dtoByteArrayBase64String);
MyDTO  myDTO = DeserializeFromByteArray<MyDTO>(inputDTOByteArray);

public T DeserializeFromByteArray<T>(byte[] byteArray)
{
  T dto;
  BinaryFormatter bf = new BinaryFormatter();
  using (MemoryStream ms = new MemoryStream(byteArray))
  {
    object obj = bf.Deserialize(ms);
    dto = (T)obj; // getting error here
  }
  return dto;
}

我遇到错误 无法将类型为“ System.String”的对象转换为类型为“ MyDTO”。

iCMS 回答:C#将类序列化为未标记为可序列化的字节[]

如果您绑定到BinaryFormatter,则所需的功能是“代理”;这不是一个小话题,因此很难举一个简单的例子,但是涵盖了完整的演练here;本质上,代理是自定义类型,它在内部使用而不是所遇到的类型,因此您的自定义类型可以执行所有所需的额外逻辑。

但是!通常,BinaryFormatter应该被认为是旧的和过时的。没有人会放弃它,并且它将继续工作(至少在.NET Framework上),但是:如果可能,您应该考虑寻找其他选择。由于某些原因:see here

本文链接:https://www.f2er.com/1812112.html

大家都在问