如何在C#中对Guid进行序列化而不创建对象?

4
我希望我的Guid可以被序列化为一个短的Guid形式(参见这里)。为了完全兼容,我希望ShortGuid类序列化成短格式,而不是长格式。
我尝试过使用自定义序列化,但似乎只能将整个对象序列化为包含字符串的对象,而不是短字符串。这是我尝试过的内容:
[Serializable]
public class ShortGuid : ISerializable
{
    public Guid Guid { get; }
    protected ShortGuid(SerializationInfo info, StreamingContext context)
    {
        Guid = Decode(info.GetString("Guid"));
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Guid", Encode(Guid));
    }
}

这个可以实现,但如果我对它进行序列化:

var guid = new ShortGuid(Guid.NewGuid());
var str = JsonConvert.Serialize(guid);

我收到的序列化字符串长这样:
{ Guid: "xxxxxxxxxxxxxxxxxx" }

我想要的序列化字符串仅为

xxxxxxxxxxxxxxxxxx

我已经尝试了很多方法,但是无法让这个东西工作。应该怎么做呢?

注意:我不希望只在JsonConvert上运行成功,这只是一个例子。我希望这个类始终能够被正确序列化。


那么对于这段代码:var str = JsonConvert.Serialize(guid.Guid);,您有什么看法? - Ehsan Sajjad
但是它将以长格式序列化,即 xxxxxxx-xxxxxxxx-xxxxxxxx。 - Gilthans
据我所知,这就是所有对象进行序列化/反序列化的方式。SerializationInfo 就像一个键和相关值的字典。你的类只有一个键这个事实对此并不重要,你仍然需要把它放进去,就像其他人一样。 - Peter B
2
看起来你混淆了序列化格式。你所写的只适用于二进制序列化。它从不生成字符串,而Guid已经支持它,并且它是“短”的,可能只有16个字节。然而,你想要的似乎是JSON序列化。这需要“Guid”,格式要求它。所以唯一的问题是你没有问题。 - Hans Passant
"ISerializable适用于所有序列化格式",你在哪里读到的? - Magnus
显示剩余2条评论
2个回答

1
这对我完美地起作用:
public class GuidShortGuidConverter : JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return objectType == typeof(Guid);
            }

            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                var shortGuid = new ShortGuid(reader.Value.ToString());
                return shortGuid.Guid;
            }

            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                var customValue = new ShortGuid((Guid) value);
                writer.WriteValue(customValue.ToString());
            }
        }

0
你想要的不是序列化,而是隐式转换。 序列化基于结构化的键/值,取决于序列化类型。 使用隐式字符串转换。
public static implicit operator string(ShortGuid shortGuid)
{
   return Encode(sh.Guid);
}

您可以使用

var guid = new ShortGuid(Guid.NewGuid());
string str = guid;

我想通过一个服务返回一个ShortGuid,并将其表示为字符串,同时也能够接收它。我不明白隐式转换与此有什么关系。 - Gilthans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接