using System; using System.IO; namespace Org.BouncyCastle.Asn1 { public abstract class Asn1Object : Asn1Encodable { [Obsolete] #pragma warning disable CS0809 // 过时成员重写未过时成员 public override void EncodeTo(Stream output) #pragma warning restore CS0809 // 过时成员重写未过时成员 { Asn1OutputStream.Create(output).WriteObject(this); } [Obsolete] #pragma warning disable CS0809 // 过时成员重写未过时成员 public override void EncodeTo(Stream output, string encoding) #pragma warning restore CS0809 // 过时成员重写未过时成员 { Asn1OutputStream.Create(output, encoding).WriteObject(this); } /// Create a base ASN.1 object from a byte array. /// The byte array to parse. /// The base ASN.1 object represented by the byte array. /// /// If there is a problem parsing the data, or parsing an object did not exhaust the available data. /// public static Asn1Object FromByteArray( byte[] data) { try { MemoryStream input = new MemoryStream(data, false); Asn1InputStream asn1 = new Asn1InputStream(input, data.Length); #pragma warning disable CS0612 // 类型或成员已过时 Asn1Object result = asn1.ReadObject(); #pragma warning restore CS0612 // 类型或成员已过时 if (input.Position != input.Length) throw new IOException("extra data found after object"); return result; } catch (InvalidCastException) { throw new IOException("cannot recognise object in byte array"); } } /// Read a base ASN.1 object from a stream. /// The stream to parse. /// The base ASN.1 object represented by the byte array. /// If there is a problem parsing the data. public static Asn1Object FromStream( Stream inStr) { try { #pragma warning disable CS0612 // 类型或成员已过时 return new Asn1InputStream(inStr).ReadObject(); #pragma warning restore CS0612 // 类型或成员已过时 } catch (InvalidCastException) { throw new IOException("cannot recognise object in stream"); } } public sealed override Asn1Object ToAsn1Object() { return this; } internal abstract int EncodedLength(bool withID); [Obsolete] internal abstract void Encode(Asn1OutputStream asn1Out, bool withID); protected abstract bool Asn1Equals(Asn1Object asn1Object); protected abstract int Asn1GetHashCode(); internal bool CallAsn1Equals(Asn1Object obj) { return Asn1Equals(obj); } internal int CallAsn1GetHashCode() { return Asn1GetHashCode(); } } }