【问题标题】:C# classes and structC# 类和结构
【发布时间】:2012-02-05 09:25:27
【问题描述】:

我在 C# 中的序列化有一些问题 有代码:

public struct CoOrds
{
    public double x, y, z;

    public CoOrds(double p1, double p2, double p3)
    {
        x = p1;
        y = p2;
        z = p3;
    }
}
public struct printColor
{
    public int r, g, b;

    public printColor(int p1, int p2, int p3)
    {
        r = p1;
        g = p2;
        b = p3;
    }
}
[Serializable]
public abstract class shape : ISerializable
{
    public int borderStyle=1;        
    /*  ===============================COLOR PARAMETERS================================ */
    public printColor colorRGB = new printColor(0, 0, 0);



    public System.Drawing.Drawing2D.DashStyle styleLine { get; set; }
    public int widht=2;

    /*=================================FILL PARAMETERS=====================================*/
    public printColor fillColorRGB = new printColor(255,255, 255);
    public shape()
    {
    }

    protected shape(SerializationInfo info, StreamingContext context)
    {
        colorRGB.r = info.GetInt32("colorLine.r");
        colorRGB.g = info.GetInt32("colorLine.g");
        colorRGB.b = info.GetInt32("colorLine.b");
        borderStyle = info.GetInt32("borderStyle");
        fillColorRGB.r = info.GetInt32("fillColorRGB.r");
        fillColorRGB.g = info.GetInt32("fillColorRGB.g");
        fillColorRGB.b = info.GetInt32("fillColorRGB.b");
        widht = info.GetInt32("widht");

    }

    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("colorLine.r",colorRGB.r);
        info.AddValue("colorLine.g", colorRGB.g);
        info.AddValue("colorLine.b", colorRGB.b);
        info.AddValue("borderStyle",borderStyle);
        info.AddValue("fillColorRGB.r", fillColorRGB.r);
        info.AddValue("fillColorRGB.g", fillColorRGB.g);
        info.AddValue("fillColorRGB.b", fillColorRGB.b);
        info.AddValue("widht", widht);
    }
 .....

1。我如何像

一样序列化结构
[Serializable]
public struct CoOrds

在类下以及如何把它放在形状和GetObjectData,因为我有太多的类我必须使用这个结构

谢谢

【问题讨论】:

  • @user1137147:不太了解您的问题。如果将结构的 content 保存在二进制序列化中会怎样,就像使用 colorline.R 一样?
  • 现在我只想了解可序列化
  • 我可以像现在这样离开,但是我有太多的代码我必须做这个可序列化的,如果我能做得更容易,我会这样做
  • 可变结构是邪恶的。除非绝对必要,否则尽量避免使用它们。
  • 你有什么理由必须实现ISerializable吗? structs 是否标记为 [Serializable]

标签: c# class struct serializable


【解决方案1】:

您可以使用info.AddValue("Pos", pos, typeof(CoOrds) 直接对其进行序列化,也可以将其转换为string

[Serializable()]
public struct Coords
{
    readonly public double x, y, z;

    public Coords(double x, double y, double z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public static Coords FromString(string value)
    {
        if (string.IsNullOrEmpty(value)) return new Coords();
        double x = 0,y= 0,z = 0;
        string[] parts = value.Split(',');
        if (parts.Length > 0) double.TryParse(parts[0], out x);
        if (parts.Length > 1) double.TryParse(parts[1], out y);
        if (parts.Length > 2) double.TryParse(parts[2], out z);
        return new Coords(x, y, z);
    }

    public override string ToString()
    {
        //Ensure round-trip formatting
        return string.Format("{0:R},{1:R},{2:R}", x, y, z);
    }

}

然后用序列化它

[Serializable()]
public class Vertex : ISerializable
{
    public Coords pos1, pos2;
    ...
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Pos1", pos1.ToString());
        info.AddValue("Pos2", pos2, typeof(Coords));
    }
    public Vertex(SerializationInfo info, StreamingContext context)
    {
        this.pos1 = Coords.FromString(info.GetValue("Pos1", typeof(string)) as string);
        this.pos2 = (Coords)info.GetValue("Pos2", typeof(Coords));
    }
}

与我所做的测试代码一样好。

【讨论】:

  • 噢噢噢!这就是我搜索的内容,谢谢
猜你喜欢
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2012-01-08
  • 2017-04-18
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多